明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: KO你

[提问] 求贱人工具的折断线

[复制链接]
 楼主| 发表于 2025-7-17 16:21:25 | 显示全部楼层
guankuiwu 发表于 2025-7-17 14:11
好吧!见最终修改的附件。那个勾默认一直选上就可以了。奖励拿来

双折断线要一直打着勾才能延伸至断口,不勾就会有断口。能否像我上面说的那样,保留以前的那个双折线,你这个为双折线2    两种样式。
样式分别为:
单折线
双折线1
双折线2   注:默认打勾状态,面板不用显示出打勾。只显示样式按钮

你现在发出来的少了前面的样式了
等你完善奖励必须的哈
回复

使用道具 举报

发表于 2025-7-17 18:51:29 | 显示全部楼层
  1. (defun c:tw3 (/ *scale* *extend* *type* dcl_id dcl_file f result pt1 pt2 ang dis x1 pt3 pt4 pt5 pt6 off up dn base_pts osd)
  2.   (vl-load-com)

  3.   ;; Initialize global variables
  4.   (if (not (boundp '*breakline-scale*)) (setq *breakline-scale* 1.0))
  5.   (if (not (boundp '*breakline-extend*)) (setq *breakline-extend* 0.0))
  6.   (if (not (boundp '*breakline-type*)) (setq *breakline-type* "single"))

  7.   ;; Create or verify "Break-Line" layer
  8.   (if (not (tblsearch "LAYER" "Break-Line"))
  9.     (command "._layer" "_make" "Break-Line" "_color" "7" "" "_ltype" "Continuous" "" "")
  10.     (command "._layer" "_thaw" "Break-Line" "_on" "Break-Line" "_set" "Break-Line" "")
  11.   )

  12.   ;; Create temporary DCL file
  13.   (setq dcl_file (vl-filename-mktemp "breakline.dcl"))
  14.   (setq f (open dcl_file "w"))
  15.   (write-line
  16.     "breakline : dialog {
  17.       label = "Breakline Settings";
  18.       : column {
  19.         : boxed_column {
  20.           label = "Parameters";
  21.           : row {
  22.             : text { label = "Scale:"; width = 8; alignment = left; }
  23.             : edit_box { key = "scale"; width = 10; value = "1.0"; }
  24.           }
  25.           : row {
  26.             : text { label = "Extension:"; width = 8; alignment = left; }
  27.             : edit_box { key = "extend"; width = 10; value = "0.0"; }
  28.           }
  29.         }
  30.         : boxed_radio_column {
  31.           label = "Breakline Type";
  32.           : radio_button { label = "Single Breakline"; key = "single"; value = "1"; }
  33.           : radio_button { label = "Double Breakline"; key = "double"; }
  34.         }
  35.         : row {
  36.           fixed_width = true;
  37.           alignment = centered;
  38.           : button { label = "OK"; key = "accept"; is_default = true; width = 8; }
  39.           : button { label = "Cancel"; key = "cancel"; is_cancel = true; width = 8; }
  40.         }
  41.       }
  42.     }" f)
  43.   (close f)

  44.   ;; Load and show dialog
  45.   (setq dcl_id (load_dialog dcl_file))
  46.   (if (not (new_dialog "breakline" dcl_id))
  47.     (progn (prompt "\nFailed to load dialog.") (exit))
  48.   )

  49.   ;; Set initial values in dialog
  50.   (set_tile "scale" (rtos *breakline-scale* 2 2))
  51.   (set_tile "extend" (rtos *breakline-extend* 2 2))
  52.   (if (eq *breakline-type* "single")
  53.     (set_tile "single" "1")
  54.     (set_tile "double" "1")
  55.   )

  56.   ;; Accept action
  57.   (action_tile "accept"
  58.     "(progn
  59.        (setq *scale* (atof (get_tile "scale")))
  60.        (setq *extend* (atof (get_tile "extend")))
  61.        (if (= (get_tile "single") "1")
  62.          (setq *type* "single")
  63.          (setq *type* "double")
  64.        )
  65.        (done_dialog 1)
  66.      )"
  67.   )

  68.   ;; Cancel action
  69.   (action_tile "cancel" "(done_dialog 0)")

  70.   ;; Run dialog
  71.   (setq result (start_dialog))
  72.   (unload_dialog dcl_id)
  73.   (vl-file-delete dcl_file)

  74.   (if (/= result 1) (exit))

  75.   ;; Save settings
  76.   (setq *breakline-scale* *scale*)
  77.   (setq *breakline-extend* *extend*)
  78.   (setq *breakline-type* *type*)

  79.   ;; Drawing breakline
  80.   (setvar "CMDECHO" 0)
  81.   (setq osd (getvar "OSMODE"))

  82.   (command "._layer" "_set" "Break-Line" "")

  83.   (setq pt1 (getpoint "\nSpecify breakline start point: "))
  84.   (if pt1
  85.     (progn
  86.       (setq pt2 (getpoint pt1 "\nSpecify breakline end point: "))
  87.       (if pt2
  88.         (progn
  89.           ;; Calculate breakline geometry
  90.           (setq ang (angle pt1 pt2)
  91.                 dis (distance pt1 pt2)
  92.                 pt1 (polar pt1 (+ ang pi) *extend*)
  93.                 pt2 (polar pt2 ang *extend*)
  94.                 ang (angle pt1 pt2)
  95.                 dis (distance pt1 pt2)
  96.                 x1 (/ (- dis (* 2 *scale*)) 2)
  97.                 pt3 (polar pt1 ang x1)
  98.                 pt4 (polar pt1 ang (+ x1 (* 2 *scale*)))
  99.                 pt5 (polar pt3 (+ ang 1.32582) (* 2.0616 *scale*))
  100.                 pt6 (polar pt4 (- ang 1.81577) (* 2.0616 *scale*))
  101.           )
  102.           (setvar "OSMODE" 0)

  103.           ;; Draw
  104.           (if (eq *type* "single")
  105.             (command "._pline" pt1 "_w" 0 0 pt3 pt5 pt6 pt4 pt2 "")
  106.             (progn
  107.               (setq off (* *scale* 0.5)
  108.                     up (+ ang (/ pi 2))
  109.                     dn (- ang (/ pi 2))
  110.                     base_pts (list pt1 pt3 pt5 pt6 pt4 pt2))
  111.               (command "._pline")
  112.               (foreach pt base_pts (command (polar pt up off)))
  113.               (command "")
  114.               (command "._pline")
  115.               (foreach pt base_pts (command (polar pt dn off)))
  116.               (command "")
  117.             )
  118.           )

  119.           ;; Restore osnap
  120.           (setvar "OSMODE" osd)
  121.         )
  122.         (setvar "OSMODE" osd) ; User canceled at pt2
  123.       )
  124.     )
  125.     (setvar "OSMODE" osd) ; User canceled at pt1
  126.   )

  127.   (princ)
  128. )
回复

使用道具 举报

发表于 2025-7-17 19:46:56 来自手机 | 显示全部楼层
好吧,我自己觉得这样就很好,专门给你再改一版,确定要三排样式啊。还是放到一排,取消单独放下面一排。那个容易明天弄下发你。
回复

使用道具 举报

 楼主| 发表于 2025-7-18 01:32:13 | 显示全部楼层
guankuiwu 发表于 2025-7-17 19:46
好吧,我自己觉得这样就很好,专门给你再改一版,确定要三排样式啊。还是放到一排,取消单独放下面一排。那 ...

三个样式上下排三排也行,排一行也行。感谢
回复

使用道具 举报

发表于 2025-7-18 09:27:58 | 显示全部楼层
KO你 发表于 2025-7-18 01:32
三个样式上下排三排也行,排一行也行。感谢

定制面板给你,里面你自己也可以改方向这些。

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2025-7-18 14:22:54 | 显示全部楼层
guankuiwu 发表于 2025-7-18 09:27
定制面板给你,里面你自己也可以改方向这些。

郁闷,就不能送佛送到西,做好全套服务
回复

使用道具 举报

发表于 2025-7-18 14:38:35 | 显示全部楼层
KO你 发表于 2025-7-18 14:22
郁闷,就不能送佛送到西,做好全套服务

已经全好了啊,我是说以原码里还可以自己再调整。
回复

使用道具 举报

 楼主| 发表于 2025-7-18 15:03:31 | 显示全部楼层
guankuiwu 发表于 2025-7-18 14:38
已经全好了啊,我是说以原码里还可以自己再调整。

我意思是你分享出完整后的程序,
单折断线
双折断线1   形态和单折断线一至,只是复制多一项,起点为中间。
双折断线2   这项目是按你最后加的静默打勾形状

你现在发出来的双折断线1是你打勾形状的
双折断线2是不打勾形状的。

唉,不愿意分享就算了,不强人所难。
回复

使用道具 举报

 楼主| 发表于 2025-7-18 15:19:57 | 显示全部楼层
本帖最后由 KO你 于 2025-7-18 15:22 编辑

(defun c:y (/ *scale* *extend* *do_extend* *type* dcl_id dcl_file f result pt1 pt2
ang dis x1 pt3 pt4 pt5 pt6 off up dn
base_pts lay osd pt1_up pt3_up pt4_up pt2_up pt1_dn pt3_dn pt4_dn pt2_dn
line1 line2 line3 line4 break_poly extend_point_line2 extend_point_line4 old_edge)
(vl-load-com)
;;初始化全局变量
(if (not (boundp '*breakline-scale*)) (setq *breakline-scale* 1.0))
(if (not (boundp '*breakline-extend*)) (setq *breakline-extend* 0.0))
(if (not (boundp '*breakline-do-extend*)) (setq *breakline-do-extend* 1));;默认勾选延伸
(if (not (boundp '*breakline-type*)) (setq *breakline-type* "single"))
;;创建DCL对话框
(setq dcl_file (vl-filename-mktemp "breakline.dcl"))
(setq f (open dcl_file "w"))
(write-line
"breakline : dialog {
label = \"折断线绘制\";
: column {
: boxed_column {
label = \"参数设置\";
: row {
: text { label = \"比例大小:\"; }
: edit_box { key = \"scale\"; width = 10; }}
: row {
: text { label = \"两头延长:\"; }
: edit_box { key = \"extend\"; width = 10; }}}
: row {
fixed_width = true;
alignment = centered;
: button { label = \"单折断线\"; key = \"single\"; width = 8; }
: button { label = \"双折断线1\"; key = \"do_extend\"; width = 8; }
: button { label = \"双折断线2\"; key = \"double\"; width = 8; }}
: button { label = \"取消\"; key = \"cancel\"; width = 8; is_cancel = true; }}}" f)
(close f)
;;加载并显示对话框
(setq dcl_id (load_dialog dcl_file))
(if (not (new_dialog "breakline" dcl_id))
(progn
(prompt "\n无法加载对话框!")
(exit)))
;;初始化对话框控件
(set_tile "scale" (rtos *breakline-scale* 2 2))
(set_tile "extend" (rtos *breakline-extend* 2 2))
(setq $tmpkey (if (boundp '$tmpkey) $tmpkey "single"))
(mode_tile $tmpkey 2)
;;设置控件动作
(action_tile "single" "(setq *scale* (atof (get_tile \"scale\")))
(setq *extend* (atof (get_tile \"extend\")))
(setq *do_extend* (if (eq (get_tile \"do_extend\") \"1\") 1 0))
(setq *type* \"single\")
(setq $tmpkey $key)
(done_dialog 1)")
(action_tile "double" "(setq *scale* (atof (get_tile \"scale\")))
(setq *extend* (atof (get_tile \"extend\")))
(setq *do_extend* 1)
(setq *type* \"double\")
(setq $tmpkey $key)
(done_dialog 2)")
(action_tile "do_extend" "(setq *scale* (atof (get_tile \"scale\")))
(setq *extend* (atof (get_tile \"extend\")))
(setq *do_extend* 0)
(setq *type* \"double2\")
(setq $tmpkey $key)
(done_dialog 2)")
(action_tile "cancel" "(done_dialog 0)")
;;处理对话框结果
(setq result (start_dialog))
(unload_dialog dcl_id)
(vl-file-delete dcl_file)
;;保存设置到全局变量
(if (> result 0)
(progn
(setq *breakline-scale* *scale*)
(setq *breakline-extend* *extend*)
(setq *breakline-do-extend* *do_extend*)
(setq *breakline-type* *type*)))
;;主绘制循环
(setvar "CMDECHO" 0)
(setq osd (getvar "osmode"))
;;循环绘制折断线
(while (and (> result 0)
(setq pt1 (getpoint "\n起点<右键退出>: "))
(setq pt2 (getpoint pt1 "\n终点<右键退出>: ")))
(progn
(setq lay (getvar "clayer"))
(setvar "osmode" 0)
;;计算基本点
(setq ang (angle pt1 pt2)
dis (distance pt1 pt2)
pt1 (polar pt1 (+ ang pi) *breakline-extend*)
pt2 (polar pt2 ang *breakline-extend*)
ang (angle pt1 pt2)
dis (distance pt1 pt2)
x1 (/ (- dis (* 2 *breakline-scale*)) 2)
pt3 (polar pt1 ang x1)
pt4 (polar pt1 ang (+ x1 (* 2 *breakline-scale*))))
;;计算折断头点
(setq off (* *breakline-scale* 0.5)
up (+ ang (/ pi 2))
dn (- ang (/ pi 2)))
;;根据折断线类型绘制
(cond
((eq *breakline-type* "single")
;;绘制单折断线
(setq pt5 (polar pt3 (- ang 1.32582) (* 2.0616 *breakline-scale*))
pt6 (polar pt4 (+ ang 1.81577) (* 2.0616 *breakline-scale*)))
(command "pline" pt1 "w" "0" "0" pt3 pt5 pt6 pt4 pt2 ""))
((eq *breakline-type* "double")
;;绘制双折断线2
;;计算竖线的端点
(setq pt1_up (polar pt1 up off)
pt3_up (polar pt3 up off)
pt4_up (polar pt4 up off)
pt2_up (polar pt2 up off)
pt1_dn (polar pt1 dn off)
pt3_dn (polar pt3 dn off)
pt4_dn (polar pt4 dn off)
pt2_dn (polar pt2 dn off))
;;计算折断头点
(setq pt5 (polar pt3_up (- ang 1.32582) (* 2.6616 *breakline-scale*))
pt6 (polar pt4_dn (+ ang 1.81577) (* 2.6616 *breakline-scale*)))
;;绘制两条竖线L2和L4
(command "line" pt4_up pt2_up "");;L2右上
(setq line2 (entlast))
(command "line" pt1_dn pt3_dn "");;L4左下
(setq line4 (entlast))
;;绘制连接折断头的主多段线L1+折断头+L3
(command "pline" pt1_up "w" "0" "0" pt3_up pt5 pt6 pt4_dn pt2_dn "")
(setq break_poly (entlast))
;;根据勾选项决定是否延伸竖线
(if (= *breakline-do-extend* 1)
(progn
;;使用EXTEND命令延伸竖线
(setq extend_point_line2 (polar pt4_up dn (* off 3)));;L2延伸点 (下方取点)
(setq extend_point_line4 (polar pt3_dn up (* off 3)));;L4延伸点 (上方取点)
(setq old_edge (getvar "EDGEMODE"))
(setvar "EDGEMODE" 1);;设置边延伸模式
(command "EXTEND" break_poly "");;选择边界
(command (list line2 extend_point_line2));;延伸L2
(command (list line4 extend_point_line4));;延伸L4
(command "");;退出命令
(setvar "EDGEMODE" old_edge))));;恢复原始边模式
((eq *breakline-type* "double2")
;;绘制双折断线1
(setq pt5 (polar pt3 (+ ang 1.32582) (* 2.0616 *breakline-scale*))
pt6 (polar pt4 (- ang 1.81577) (* 2.0616 *breakline-scale*))
base_pts (list pt1 pt3 pt5 pt6 pt4 pt2))
;;绘制上方的折断线
(command "pline")
(foreach pt base_pts (command (polar pt up off)))
(command "")
;;绘制下方的折断线
(command "pline")
(foreach pt base_pts (command (polar pt dn off)))
(command ""))))
;;恢复设置
(command "layer" "s" lay "")
(setvar "osmode" osd)
(princ "\n折断线绘制完成。继续绘制下一根...")))
(setvar "osmode" osd)
(princ))
我整合了一下,可以实际想要的功能,但加载出现 参数类型错误: lentityp nil  不知道这是啥情况
回复

使用道具 举报

发表于 2025-7-18 18:27:08 | 显示全部楼层
KO你 发表于 2025-7-18 15:03
我意思是你分享出完整后的程序,
单折断线
双折断线1   形态和单折断线一至,只是复制多一项,起点为中 ...

完全没明白你想要啥,不是你最初就画了图两种类型了么,现在三种,又要哪样的?又有啥想法了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-14 13:44 , Processed in 0.193450 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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