明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 45816|回复: 345

[讨论] 智能中心线

    [复制链接]
发表于 2013-11-19 14:58:17 | 显示全部楼层 |阅读模式
本帖最后由 自贡黄明儒 于 2013-11-23 10:59 编辑

感谢大家帮助
;;编组开始;(command "_.undo" "be")
(defun _StartUndo (*DOC*)
  (_EndUndo *DOC*)
  (vla-StartUndoMark *DOC*)
)
;;结束编组;(if (= 8 (logand (getvar "undoctl") 8)) (command "_.undo" "_e"))
(defun _EndUndo (*DOC*)
  (if (= 8 (logand 8 (getvar 'UNDOCTL)))
    (vla-EndUndoMark *DOC*)
  )
)

  1. <P>
  2. ;;中心标记CenterMark By 自贡黄明儒 2013年11月9日***********************************
  3. (defun C:CM (/ *MSP* CIRC CLAYER1 CMDECHO1 E1EN E1ST E2EN E2ST ELLI EN1 EN2 FIL FILTERLST LIN LWP N P0 REG SS VARTXTLST X Y)
  4.   ;;0 错误处理
  5.   (defun *error* (msg)
  6.     (setvar "cmdecho" cmdecho1)
  7.     (setvar "clayer" clayer1)
  8.     (vl-bt)
  9.     (if *DOC*
  10.       (_EndUndo *DOC*)         ;块内图元增减
  11.     )
  12.     (while (not (equal (getvar "cmdnames") "")) (command nil))
  13.     (princ "\n 出错啦!")
  14.     (princ)
  15.   )</P>
  16. <P>  ;;1 两点之中点
  17.   (defun mid (p1 p2 / X Y)
  18.     (mapcar '(lambda (X Y) (/ (+ X Y) 2.0)) p1 p2)
  19.   )</P>
  20. <P>  ;;2.1 从选择集中分离出特定选择集
  21.   (defun wmg-ssgetp (ss filter)
  22.     (vl-cmdf "_.select" ss "")
  23.     (ssget "p" filter)
  24.   )</P>
  25. <P>  ;;2.2 分离选择集
  26.   ;; (optimizeCode ss vartxtlst filterlst)
  27.   (defun optimizeCode (ss vartxtlst filterlst)
  28.     (mapcar (function (lambda (x y) (set x (wmg-ssgetp ss y))))
  29.      (mapcar 'read vartxtlst)
  30.      filterlst
  31.     )
  32.   )</P>
  33. <P>  ;;3 面域质心
  34.   (defun HH:REGION (en / CEN LL LST OBJ R UR)
  35.     (setq obj (vlax-ename->vla-object en))
  36.     (setq cen (vlax-safearray->list (vlax-variant-value (vla-get-Centroid obj))))
  37.     (vla-getboundingbox obj 'll 'ur)
  38.     (setq lst (mapcar 'vlax-safearray->list (list ll ur)))
  39.     (setq r (/ (distance (car lst) (cadr lst)) 2.0))
  40.     (Ptline (mapcar '- cen (list r 0 0)) (mapcar '+ cen (list r 0 0)))   
  41.     (Ptline (mapcar '- cen (list 0 r 0)) (mapcar '+ cen (list 0 r 0)))
  42.   )</P>
  43. <P>  ;;4.1 两线不平行时,画角平分线
  44.   (defun HH:Bisect (en1 en2 / PT1 PT2 PT3 X Y)
  45.     (if (< (distance p0 e1st) (distance p0 e1en))
  46.       (setq e1st e1en)
  47.     )
  48.     (if (< (distance p0 e2st) (distance p0 e2en))
  49.       (setq e2st e2en)
  50.     )
  51.     (setq PT1 (polar p0 (angle p0 e1st) 10))
  52.     (setq PT2 (polar p0 (angle p0 e2st) 10))
  53.     (setq PT3 (mid PT1 PT2))
  54.     (setq PT3 (inters p0 PT3 e1st e2st nil))
  55.     (Ptline p0 PT3)
  56.   )</P>
  57. <P>  ;;4.2 两线平行时,画梯形腰线(找对称中心线)
  58.   (defun HH:waist (en1 en2 / P0 P3 X Y)   
  59.     (if (inters e1st e2st e1en e2en)
  60.       (setq P0 (mid e1st e2en)
  61.      P3 (mid e1en e2st)
  62.       )
  63.       (setq P0 (mid e1st e2st)
  64.      P3 (mid e1en e2en)
  65.       )
  66.     )
  67.     (Ptline P0 p3)
  68.   )</P>
  69. <P>  ;;5 圆、弧时,如果中心点没有相互垂直的两条线,画十字中心线
  70.   (defun HH:circleCross (en / ANG1 ANG2 E1EN E1ST E2EN E2ST EN1 EN2 ENT P10 R SS)
  71.     (setq ent (entget en))
  72.     (setq p10 (cdr (assoc 10 ent)))
  73.     (setq r (* (cdr (assoc 40 ent)) 1.25))
  74.     (if (and (setq ss (ssget "_C"
  75.         p10
  76.         p10
  77.         (list '(-4 . "<or")    '(0 . "LINE")    '(-4 . "<and")
  78.        '(0 . "LWPOLYLINE")       '(90 . 2)
  79.        '(-4 . "and>")   '(-4 . "or>")
  80.       )
  81.         )
  82.       )
  83.       (cond ((equal (sslength ss) 2)
  84.       (setq en1 (ssname ss 0))
  85.       (setq en2 (ssname ss 1))
  86.       (setq e1st (vlax-curve-getStartPoint en1))
  87.       (setq e1en (vlax-curve-getendPoint en1))
  88.       (setq e2st (vlax-curve-getStartPoint en2))
  89.       (setq e2en (vlax-curve-getendPoint en2))
  90.       (setq ang1 (angle e1st e1en))
  91.       (setq ang2 (angle e2st e2en))
  92.       (equal (rem (- ang1 ang2) (/ pi 2)) 0)
  93.      )
  94.      ((> (sslength ss) 2) T)
  95.      (T nil)
  96.       )
  97. )
  98.       nil
  99.       (progn
  100. (Ptline (mapcar '- p10 (list r 0 0)) (mapcar '+ p10 (list r 0 0)))
  101. (Ptline (mapcar '- p10 (list 0 r 0)) (mapcar '+ p10 (list 0 r 0)))
  102.       )
  103.     )
  104.   )</P>
  105. <P>  ;;6 是平行四边形时画中心线,其它封闭曲线在质心处画十字线
  106.   (defun HH:CenMark (en / CEN LL LST OBJ OBJN P1 P2 PX1 PX2 PY1 PY2 R UR X Y la)
  107.     ;;133.2 [功能] 缩放一个点
  108.     ;;scale 'pnt' from a base point of 'p1' by a factor of fact
  109.     (defun scale_pnt (pnt p1 fact /)
  110.       (polar p1 (angle p1 pnt) (* fact (distance p1 pnt)))
  111.     )</P>
  112. <P>    (if (and
  113.    (setq lst (entget en))
  114.    (setq lst (mapcar 'cdr
  115.        (vl-remove-if-not '(lambda (x) (= (car x) 10)) lst)
  116.       )
  117.    )
  118.    (equal (length lst) 4)
  119.    (not (inters (car lst) (cadr lst) (caddr lst) (cadddr lst) nil))
  120.    (not (inters (cadr lst) (caddr lst) (cadddr lst) (car lst) nil))
  121. )
  122.       (progn
  123. (setq cen (mid (car lst) (caddr lst)))
  124. (setq p1 (mid (car lst) (cadddr lst)))
  125. (setq p1 (scale_pnt p1 cen 1.25))
  126. (setq p2 (mid (cadr lst) (caddr lst)))
  127. (setq p2 (scale_pnt p2 cen 1.25))
  128. (Ptline p1 p2)
  129. (setq p1 (mid (car lst) (cadr lst)))
  130. (setq p1 (scale_pnt p1 cen 1.25))
  131. (setq p2 (mid (caddr lst) (cadddr lst)))
  132. (setq p2 (scale_pnt p2 cen 1.25))
  133. (Ptline p1 p2)
  134.       )
  135.       (progn
  136. (setq *MSP* (vla-get-Modelspace *DOC*))
  137. (vlax-invoke *MSP* 'addregion (list (vlax-ename->vla-object en)))
  138. (setq la (entlast))
  139. (HH:REGION la)
  140. (vla-delete (vlax-ename->vla-object la))
  141.       )
  142.     )
  143.   )</P>
  144. <P>  ;;7 椭圆中心标记
  145.   ;;用highflybir的程序改造一下
  146.   (defun HH:ELLIPSEMark (ent / DXF MAJ P1 P10 P2 P3 P4 PTB PTD SS fil)
  147.     (setq fil (list '(-4 . "<or") '(0 . "LINE") '(-4 . "<and") '(0 . "LWPOLYLINE") '(90 . 2)
  148.       '(-4 . "and>") '(-4 . "or>"))
  149.     )
  150.     (setq dxf (entget ent))
  151.     (setq p10 (cdr (assoc 10 dxf)))
  152.     (if (and (setq ss (ssget "_C" p10 p10 fil)) (> (sslength ss) 1))
  153.       nil
  154.       (progn
  155. (setq maj (cdr (assoc 11 dxf)))
  156. (setq ptb (vlax-curve-getPointAtParam ent (* pi 0.5)))
  157. (setq ptd (vlax-curve-getPointAtParam ent (* pi 1.5)))
  158. (setq p1 (mapcar '- ptd maj))
  159. (setq p2 (mapcar '+ ptd maj))
  160. (setq p3 (mapcar '+ ptb maj))
  161. (setq p4 (mapcar '- ptb maj))
  162. (Ptline p1 p3)
  163. (Ptline p2 p4)
  164.       )
  165.     )
  166.   )</P>
  167. <P>  ;;8 两点画直线
  168.   (defun Ptline (p1 p2)
  169.     (entmake (list (cons 0 "LINE") (cons 10 p1) (cons 11 p2)))
  170.   )</P>
  171. <P>  ;;9  本程序主程序
  172.   (setq fil (list '(-4 . "<or")      '(0 . "CIRCLE") '(0 . "ARC")
  173.     '(0 . "ELLIPSE")   '(0 . "LINE") '(0 . "REGION")
  174.     '(-4 . "<and")     '(0 . "LWPOLYLINE")
  175.     '(-4 . "<or")      '(70 . 1)  '(90 . 2)
  176.     '(-4 . "or>")      '(-4 . "and>") '(-4 . "or>")
  177.    )
  178.   )
  179.   (if (cadr (ssgetfirst))
  180.     (setq ss (ssget "_P" fil))
  181.     (setq ss (ssget fil))
  182.   )
  183.   (vl-load-com)
  184.   (or *DOC*
  185.       (setq *DOC* (vla-get-ActiveDocument (vlax-get-acad-object)))
  186.   )
  187.   (_StartUndo *DOC*)
  188.   (setq cmdecho1 (getvar "cmdecho"))
  189.   (setq clayer1 (getvar "clayer"))
  190.   (setvar "cmdecho" 0)</P>
  191. <P>  (vl-cmdf "_layer" "make" "中心线" "Color" 6 "" "L" "ACAD_ISO10W100" "" "")
  192.   (setq vartxtlst (list "CIRC" "ELLI" "LIN" "LWP" "REG"))
  193.   (setq filterlst (list (list '(0 . "CIRCLE,ARC"))
  194.    (list '(0 . "ELLIPSE"))
  195.    (list '(-4 . "<or")    '(0 . "LINE") '(-4 . "<and")
  196.          '(0 . "LWPOLYLINE")  '(90 . 2)
  197.          '(-4 . "and>")   '(-4 . "or>")
  198.         )
  199.    (list '(0 . "LWPOLYLINE") '(70 . 1))
  200.    (list '(0 . "REGION"))
  201.     )
  202.   )
  203.   (optimizeCode ss vartxtlst filterlst)
  204.   (setvar "cmdecho" cmdecho1)
  205.   (if CIRC
  206.     (repeat (setq n (sslength CIRC))
  207.       (HH:circleCross (ssname CIRC (setq n (1- N))))
  208.     )
  209.   )
  210.   (if ELLI
  211.     (repeat (setq n (sslength ELLI))
  212.       (HH:ELLIPSEMark (ssname ELLI (setq n (1- N))))
  213.     )
  214.   )
  215.   (if LWP
  216.     (repeat (setq n (sslength LWP))
  217.       (HH:CenMark (ssname LWP (setq n (1- N))))
  218.     )
  219.   )
  220.   (if REG
  221.     (repeat (setq n (sslength REG))
  222.       (HH:REGION (ssname REG (setq n (1- N))))
  223.     )
  224.   )
  225.   (if LIN
  226.     (while (> (sslength LIN) 1)
  227.       (setq en1 (ssname LIN 0))
  228.       (setq en2 (ssname LIN 1))
  229.       (ssdel en1 LIN)
  230.       (ssdel en2 LIN)
  231.       (setq e1st (vlax-curve-getStartPoint en1))
  232.       (setq e1en (vlax-curve-getendPoint en1))
  233.       (setq e2st (vlax-curve-getStartPoint en2))
  234.       (setq e2en (vlax-curve-getendPoint en2))
  235.       (setq p0 (inters e1st e1en e2st e2en nil))
  236.       (if p0
  237. (HH:Bisect en1 en2)
  238. (HH:waist en1 en2)
  239.       )
  240.     )
  241.   )
  242.   (setvar "clayer" clayer1)
  243.   (_EndUndo *DOC*)
  244.   (gc)
  245.   (princ)
  246. )
  247. ;;中心标记CenterMark By 自贡黄明儒 2013年11月9日***********************************</P>

本帖子中包含更多资源

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

x

点评

请问这个与小笨智能中心线v1.3区别在哪啊 ? http://bbs.mjtd.com/forum.php?mod=viewthread&tid=96275  发表于 2014-3-19 09:18
"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2021-2-15 19:55:29 | 显示全部楼层
下面这种图片http://bbs.mjtd.com/forum.php?mod=attachment&aid=MTEyMzk0fDlkOTEyMjRmYTVkODkzZDllMjQyOTMxNDk0OTZiNGJjfDE3MzE1NjY4Mzc%3D&request=yes&_f=.jpg

本帖子中包含更多资源

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

x
发表于 2021-2-15 19:53:18 | 显示全部楼层
黄大师,请问,能否把平行线的 中心线  加长,让  中心线  比   平行线  长出很多 ?在哪里改啊?
发表于 2013-11-19 15:35:59 | 显示全部楼层
本帖最后由 liu22737 于 2013-11-19 15:39 编辑

win7 AUTOCAD2008
不能运行
; 错误: *error* 函数中出错AutoCAD 变量设置被拒绝: "cmdecho" nil

我觉得椭圆中心线应该在旋转45°,两线应该垂直

点评

有道理  发表于 2013-11-19 15:57
发表于 2013-11-19 18:18:26 | 显示全部楼层
winxp AUTOCAD2004不能运行;
错误: *error* 函数中出错AutoCAD 变量设置被拒绝: "cmdecho" nil

点评

原来缺两个函数  发表于 2013-11-20 08:55

评分

参与人数 1明经币 +1 收起 理由
flytoday + 1 对于平行线中心应该设置个平台线间距离多少.

查看全部评分

发表于 2013-11-20 11:10:00 | 显示全部楼层
支持黄工,感谢分享
发表于 2013-11-20 12:43:49 | 显示全部楼层
错误: *error* 函数中出错AutoCAD 变量设置被拒绝
发表于 2013-11-20 12:58:53 | 显示全部楼层
好像不错,下来看看
发表于 2013-11-20 12:59:41 | 显示全部楼层
路过。学习学习
发表于 2013-11-20 15:11:19 | 显示全部楼层
支持一下哦~
发表于 2013-11-20 15:28:21 | 显示全部楼层
老黄厉害啊
发表于 2013-11-20 15:32:32 | 显示全部楼层
不错哦,支持一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-14 14:47 , Processed in 0.202706 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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