明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 281|回复: 21

[源码] 分享一个可以画斜线15°外廓线的代码

[复制链接]
发表于 昨天 09:19 | 显示全部楼层 |阅读模式
本帖最后由 Qwer1243 于 2024-9-24 11:41 编辑

在放样水撑和柱撑详图的过程中可能会用到,有需要的可以看一下;有优化意见的欢迎分享
  1. (defun c:e7 (/ ang c data line m m_perp pt pt1 pt2 pt3 pt4 x x1 x2 y y_proj y1 y2)
  2.   (setvar "cmdecho" 0)
  3.   (setq line (entsel "\n选择直线: "))
  4.   (setq pt (getpoint "\n请指定方向: "))
  5.   (setq data (entget (car line)))
  6.   (setq x1 (cadr (assoc 10 data)) x2 (cadr (assoc 11 data)) y1 (caddr (assoc 10 data)) y2 (caddr (assoc 11 data)))
  7.   
  8.   ;;选择直线为水平线
  9.   (if (= y1 y2)
  10.     (progn
  11.       (princ "\n为水平线")
  12.       (setq ang (/ pi 2))
  13.       (if (< x1 x2)
  14.         (progn
  15.           (setq pt1 (cdr (assoc 10 data))) ; 获取直线的第一个点
  16.           (setq pt2 (cdr (assoc 11 data))) ; 获取直线的第二个点)
  17.         )
  18.         (progn
  19.           (setq pt2 (cdr (assoc 10 data))) ; 获取直线的第一个点
  20.           (setq pt1 (cdr (assoc 11 data))) ; 获取直线的第二个点)
  21.         )
  22.       )
  23.       (if (> (cadr pt) y1)
  24.         (progn
  25.           (princ "\n点在直线上方。")
  26.           (setq pt3 (polar pt1 (+ ang (* pi (/ 15 180.0))) 300))
  27.           (setq pt4 (polar pt2 (- ang (* pi (/ 15 180.0))) 300))
  28.         )
  29.         (progn
  30.           (princ "\n点在直线下方。")
  31.           (setq pt3 (polar pt1 (- ang (* pi (/ 195 180.0))) 300))
  32.           (setq pt4 (polar pt2 (+ ang (* pi (/ 195 180.0))) 300))
  33.         )
  34.       )
  35.     )
  36.   )
  37.   
  38.   ;;选择直线为竖直线
  39.   (if (= x1 x2)
  40.     (progn
  41.       (princ "\n为竖直线")
  42.       (setq ang 0)
  43.       (if (< y1 y2)
  44.         (progn
  45.           (setq pt1 (cdr (assoc 10 data))) ; 获取直线的第一个点
  46.           (setq pt2 (cdr (assoc 11 data))) ; 获取直线的第二个点)
  47.         )
  48.         (progn
  49.           (setq pt2 (cdr (assoc 10 data))) ; 获取直线的第一个点
  50.           (setq pt1 (cdr (assoc 11 data))) ; 获取直线的第二个点)
  51.         )
  52.       )
  53.       (if (> (car pt) x1)
  54.         (progn
  55.           (princ "\n点在直线右侧。")
  56.           (setq pt3 (polar pt1 (- ang (* pi (/ 15 180.0))) 300))
  57.           (setq pt4 (polar pt2 (+ ang (* pi (/ 15 180.0))) 300))
  58.         )
  59.         (progn
  60.           (princ "\n点在直线左侧。")
  61.           (setq pt3 (polar pt1 (+ ang (* pi (/ 195 180.0))) 300))
  62.           (setq pt4 (polar pt2 (- ang (* pi (/ 195 180.0))) 300))
  63.         )
  64.       )
  65.     )
  66.   )
  67.   
  68.   ;;选择直线为斜线
  69.   (if (and (/= x1 x2) (/= y1 y2))
  70.     (progn
  71.       (princ "\n为斜线")
  72.       (if (< y1 y2)
  73.         (progn
  74.           (setq pt1 (cdr (assoc 10 data))) ; 获取直线的第一个点
  75.           (setq pt2 (cdr (assoc 11 data))) ; 获取直线的第二个点)
  76.         )
  77.         (progn
  78.           (setq pt2 (cdr (assoc 10 data))) ; 获取直线的第一个点
  79.           (setq pt1 (cdr (assoc 11 data))) ; 获取直线的第二个点)
  80.         )
  81.       )
  82.       
  83.       ; 计算斜率 m 和截距 c
  84.       (setq m (/ (- (cadr pt2) (cadr pt1)) (- (car pt2) (car pt1))))
  85.       (setq c (- (cadr pt1) (* m (car pt1))))
  86.       
  87.       ; 计算垂直线的斜率
  88.       (setq m_perp (- (/ 1 m)))
  89.       
  90.       ; 计算角度
  91.       (setq ang (atan m_perp))
  92.       
  93.       ;计算点 P 到直线的垂直投影点的 y 坐标
  94.       (setq x (car pt))
  95.       (setq y_proj (+ (* m x) c))
  96.       
  97.       ;判断点的位置
  98.       (if (> ang 0)
  99.         (if (> (cadr pt) y_proj)
  100.           (progn
  101.             (princ "\n点在直线上方。")
  102.             (setq pt3 (polar pt1 (- ang (* pi (/ 15 180.0))) 300))
  103.             (setq pt4 (polar pt2 (+ ang (* pi (/ 15 180.0))) 300))
  104.           )
  105.           (progn
  106.             (princ "\n点在直线下方。")
  107.             (setq pt3 (polar pt1 (+ ang (* pi (/ 195 180.0))) 300))
  108.             (setq pt4 (polar pt2 (- ang (* pi (/ 195 180.0))) 300))
  109.           )
  110.         )
  111.         (if (> (cadr pt) y_proj)
  112.           (progn
  113.             (princ "\n点在直线上方。")
  114.             (setq pt3 (polar pt1 (+ ang (* pi (/ 195 180.0))) 300))
  115.             (setq pt4 (polar pt2 (- ang (* pi (/ 195 180.0))) 300))
  116.           )
  117.           (progn
  118.             (princ "\n点在直线下方。")
  119.             (setq pt3 (polar pt1 (- ang (* pi (/ 15 180.0))) 300))
  120.             (setq pt4 (polar pt2 (+ ang (* pi (/ 15 180.0))) 300))
  121.           )
  122.         )
  123.       )
  124.     )
  125.   )
  126.   
  127.   (entmakeX (list '(0 . "LINE") (cons 10 pt1) (cons 11 pt3)))
  128.   (entmakeX (list '(0 . "LINE") (cons 10 pt2) (cons 11 pt4)))
  129.   (princ)
  130. )

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

选水平线报错  发表于 昨天 09:46

评分

参与人数 2明经币 +2 收起 理由
cghdy + 1 赞一个!
bssurvey + 1 赞一个!

查看全部评分

发表于 昨天 11:54 | 显示全部楼层
本帖最后由 自贡黄明儒 于 2024-9-24 14:57 编辑
Qwer1243 发表于 2024-9-24 11:45
我不会做面板,你要是方便的话可以帮忙更新一下面板,我刚才重新上传了代码,水平和竖直线不会报错了

  1. (defun C:Ban (/ dialog getdata setdata do1 DCLID FN FNAME)
  2.   (defun dialog        ()
  3.     (setq fname (vl-filename-mktemp nil nil ".dcl"))
  4.     (setq fn (open fname "w"))
  5.     (write-line        "HHbianban : dialog{label=\"画边板 黄明儒\";"
  6.                 fn
  7.     )
  8.     (write-line        " :edit_box{label=\"边距 (mm)\";key=\"key1\";value=\"20\";}"
  9.                 fn
  10.     )
  11.     (write-line        " :edit_box{label=\"角度(mm)\";key=\"key2\";value=\"15\";}"
  12.                 fn
  13.     )
  14.     (write-line        " :edit_box{label=\"离端部 倍数\";key=\"key3\";value=\"1.5\";}"
  15.                 fn
  16.     )
  17.     (write-line " ok_cancel;" fn)
  18.     (write-line "  }" fn)
  19.     (close fn)
  20.   )

  21.   (defun getdata (/ DCLDATA I KEY)
  22.     (setq i 0)
  23.     (repeat 3                                                    ;"key1"到"key5"
  24.       (setq i (1+ i))
  25.       (setq key (strcat "key" (itoa i)))
  26.       (set (read key) (get_tile key))
  27.       (setq DCLData (cons (cons key (eval (read key))) DCLData))
  28.     )
  29.     (Setenv "HHbianban" (VL-PRIN1-TO-STRING DCLData))
  30.   )

  31.   (defun setdata (/ DCLDATA X)
  32.     (cond ((setq DCLData (getenv "HHbianban"))
  33.            (setq DCLData (read DCLData))
  34.            (mapcar '(lambda (x) (Set_tile (car x) (cdr x))) DCLData)
  35.           )
  36.     )
  37.   )

  38.    (defun do1 ()
  39.     (ACET-UNDO-BEGIN)                                            ;编组
  40.     (setq e0 (entlast))
  41.     (if        (setq e (entsel "\n 型钢端线:"))
  42.       (progn
  43.         (setq p0 (cadr e))
  44.         (setq obj (vlax-ename->vla-object (car e)))
  45.         (setq key3 (* (distof key3) (vlax-get obj 'length)))
  46.         (setq key3 (VL-PRINC-TO-STRING key3))
  47.         (vl-cmdf "_offset" key3 e pause "")
  48.       )
  49.     )
  50.     ;;如果偏移成功
  51.     (setq e (entlast))
  52.     (if        (not (equal e e0))
  53.       (do2 e)
  54.     )
  55.     (ACET-UNDO-END)
  56.   )


  57.   ;;与PPCAD保持一致
  58.   (if (not (tblsearch "layer" "4虚线层"))
  59.     (vl-cmdf "_layer" "_M" "4虚线层" "_C" 6 "" "L" "DASHED" "" "")
  60.   )

  61.   (dialog)
  62.   (setq dclid (load_dialog fname))
  63.   (new_dialog "HHbianban" dclid)
  64.   (setdata)
  65.   (action_tile "accept" "(getdata)(done_dialog 1)")
  66.   (action_tile "cancel" "(getdata)(done_dialog 0)")
  67.   (setq return# (start_dialog))
  68.   (unload_dialog dclid)
  69.   (vl-file-delete fname)
  70.   (cond ((equal return# 1) (do1)))
  71. )

do2就交给你了
 楼主| 发表于 昨天 10:27 | 显示全部楼层
自贡黄明儒 发表于 2024-9-24 10:14
机械行业同行呀,这个不错。以往我都是手画的。
选择角钢端部那条线,每边留20mm,以便于焊接,再沿角钢另 ...

我是钢结构深化的,经常会用到,两边的却是经常预留20mm,是不是规范我也不清楚
 楼主| 发表于 昨天 12:08 | 显示全部楼层

我看一下,试着调整一下
离端部倍数,说的是我下面图片箭头指示这个吗?C:\Users\Administrator\Desktop\1727150774230.jpg

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

是  发表于 昨天 12:27
发表于 昨天 10:14 | 显示全部楼层
机械行业同行呀,这个不错。以往我都是手画的。
选择角钢端部那条线,每边留20mm,以便于焊接,再沿角钢另一边移动一个距离(不知道这个距离有没有规范要求),这样更智能。
发表于 昨天 10:19 | 显示全部楼层
这不钢结构嘛, 必须15度吗? 不能自动剪裁
发表于 昨天 10:25 | 显示全部楼层
tiancao100 发表于 2024-9-24 10:19
这不钢结构嘛, 必须15度吗? 不能自动剪裁

这个角度应该是个变值,可以取0度。关键楼主点取那条线,到角钢端部,有没有规范要求。
 楼主| 发表于 昨天 10:28 | 显示全部楼层
tiancao100 发表于 2024-9-24 10:19
这不钢结构嘛, 必须15度吗? 不能自动剪裁

15度,可以在代码里面调整,一般都是15度,我就没添加调整参数
发表于 昨天 11:23 | 显示全部楼层
本帖最后由 自贡黄明儒 于 2024-9-24 14:54 编辑
Qwer1243 发表于 2024-9-24 10:28
15度,可以在代码里面调整,一般都是15度,我就没添加调整参数

弄个界面,适应各种情况

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 昨天 11:42 | 显示全部楼层
我更新了一下代码,可以使用与水平和竖直线了@xyp1964
 楼主| 发表于 昨天 11:45 | 显示全部楼层
自贡黄明儒 发表于 2024-9-24 11:23
弄个界面,适应各种情况

我不会做面板,你要是方便的话可以帮忙更新一下面板,我刚才重新上传了代码,水平和竖直线不会报错了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-9-25 04:39 , Processed in 0.160286 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表