明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6457|回复: 23

[源码] 轴截断面,管道截断面 支持同一根多段线

[复制链接]
发表于 2014-5-26 16:29:27 | 显示全部楼层 |阅读模式
轴截断面,管道截断面 支持同一根多段线


  1. ;;轴截断面,管道截断面 支持多段线
  2. ;;code by edata @mjtd
  3. ;;2014-5-26
  4. (defun sk_mkpl02(lst sk_lay sk_col sk_lt sk_lts sk_lw)
  5.   (entmakex
  6.     (append(list '(0 . "LWPOLYLINE")
  7.      '(100 . "AcDbEntity")
  8.      '(100 . "AcDbPolyline")
  9.      (cons 8 (if sk_lay sk_lay (getvar 'clayer)))
  10.      (cons 62 (if sk_col sk_col 256))
  11.      (cons 6 (if sk_lt sk_lt (getvar 'celtype)))
  12.      (cons 48 (if sk_lts sk_lts (getvar 'celtscale)))
  13.      (cons 370 (if sk_lw sk_lw (getvar 'celweight)))
  14.      )
  15.      lst
  16.      )
  17.     )
  18.   )
  19. (defun *error*_jdx (msg)
  20.   (if *error*_jdx0(setq *error* *error*_jdx0))
  21.   (if (wcmatch (strcase msg t) "*break,*cancel*,*exit*,*取消*")
  22.     (if  (= (getvar "LOCALE") "CHS")
  23.       (princ "\n用户按了<Esc>强制退出")
  24.       (princ "\nYou cancelled The operation!")
  25.     )
  26.     (princ (strcat "\n" msg))
  27.   )
  28.   (progn
  29.       (and en1(redraw (car en1) 4))
  30.       (and en2(redraw (car en2) 4))
  31.       )
  32.   (if(= (getvar 'cmdecho) 0)(setvar 'cmdecho 1))
  33.   (vla-EndUndoMark(vla-get-ActiveDocument (vlax-get-acad-object)))
  34.   (princ)
  35. )

  36. ;;;计算cp到p1 p2的垂足点
  37. (defun PerToLine  (cp p1 p2 / norm)
  38.   (setq        norm (mapcar '- p2 p1)
  39.         p1   (trans p1 0 norm)
  40.         cp   (trans cp 0 norm)
  41.         )
  42.   (trans (list (car p1) (cadr p1) (caddr cp)) norm 0)
  43.   )
  44. (defun sk_ty (ent lst)
  45.   (member(cdr(assoc 0 (entget ent)))(mapcar 'strcase lst))
  46.   )
  47. (defun sk_dxf(ent code)(cdr(assoc code(entget ent))))
  48. (defun c:tt(/ ang1 b_hd cmpt c_pt1 c_pt2 ds1 e1 e2 elast1 elast2 elist1 elist2 elist3 elist4 en1 en2 index0 index0+ index00 index00+
  49.       indexend lst1 lst2 lst3 lst4 obj p0 p00 p00x p0x p1 p2 p3 p4 pl1 pl2 pl3 pl4 px1 px2 px3 px4 x y
  50.       e1_lay e1_col e1_lt e1_lts e1_lw)
  51.   (vl-load-com)
  52.   (setq *error*_jdx0 *error*)    ;保存出错处理函数
  53.   (setq *error* *error*_jdx)
  54.   (vla-StartUndoMark(vla-get-ActiveDocument (vlax-get-acad-object)))
  55.   (setq lst1'((90 . 6)(10 -0.175 5.55112e-017)(42 . -0.305615)(10 -0.0822974 -0.4375)(42 . -0.6742)(10 -0.267702 -0.4375)(42 . -0.305615)
  56.         (10 -0.175 -5.55112e-017)(42 . 0.305615)(10 -0.0822974 0.4375)(42 . 0.305615)(10 -0.175 0.5)(42 . 0.0))
  57.   lst2'((90 . 6)(10 0.175 -5.55112e-017)(42 . -0.305615)(10 0.0822974 0.4375)(42 . -0.6742)(10 0.267702 0.4375)(42 . -0.305615)
  58.         (10 0.175 5.55112e-017)(42 . 0.305615)(10 0.0822974 -0.4375)(42 . 0.305615)(10 0.175 -0.5)(42 . 0.0))
  59.   lst3'((90 . 3)(70 . 1)(10 -0.175 0.0)(42 . 0.305615)(10 -0.267702 -0.4375)(42 . 0.6742)(10 -0.0822974 -0.4375)(42 . 0.305615))
  60.   lst4'((90 . 3)(70 . 1)(10 0.267702 0.4375)(42 . 0.6742)(10 0.0822974 0.4375)(42 . 0.305615)(10 0.175 0.0)(42 . 0.305615))
  61.   )
  62.   (command nil)
  63.   (if(and(setq en1(entsel "\n请选择第一条线:"))
  64.    (sk_ty (car en1) '("line" "lwpolyline"))
  65.    (car(list t(redraw (car en1) 3)))
  66.    (setq en2(entsel "\n请选择第二条线:"))
  67.    (sk_ty (car en2) '("line" "lwpolyline"))
  68.    (car(list t(redraw (car en2) 3)))
  69.    )
  70.     (progn      
  71.       (cond
  72.   ((and (sk_ty (car en1)'("line"))
  73.         (sk_ty (car en2)'("line"))
  74.         (/=(sk_dxf (car en1) 5)(sk_dxf (car en2) 5)))
  75.    (setq e1(car en1)
  76.          e2(car en2)
  77.          p0(cadr en1)
  78.          p1(sk_dxf e1 10)
  79.          p2(sk_dxf e1 11)
  80.          p3(sk_dxf e2 10)
  81.          p4(sk_dxf e2 11)         
  82.          c_pt1(PerToLine p0 p1 p2)
  83.          c_pt2(PerToLine p0 p3 p4)
  84.          ang1 (angle c_pt1 c_pt2)
  85.          cmpt(mapcar'(lambda(x y)(* 0.5(+ x y))) c_pt1 c_pt2)
  86.          )
  87.    (if (inters p1 p2 p3 p4 nil)
  88.      (princ "\n两条直线不平行.")
  89.      (progn
  90.        (princ "\n平行直线.")      
  91.        (setq ds1 (distance c_pt1 c_pt2)
  92.        px1(polar c_pt1 (angle p1 p2) (* 0.175 ds1))
  93.        px2(polar c_pt1 (angle p2 p1) (* 0.175 ds1))
  94.        px3(polar c_pt2 (angle p3 p4) (* 0.175 ds1))
  95.        px4(polar c_pt2 (angle p4 p3) (* 0.175 ds1))
  96.        )
  97.        (if(setq b_hd (getreal (strcat "\n输入壁厚(0/小于当前半径" (rtos (* 0.5 ds1) 2 ) "):")))(princ)(setq b_hd 0))
  98.        (if
  99.        (and b_hd
  100.       (> (distance c_pt1 p1)(distance c_pt1 px2))
  101.       (> (distance c_pt1 p2)(distance c_pt1 px1))
  102.       (> (distance c_pt2 p3)(distance c_pt2 px4))
  103.       (> (distance c_pt2 p4)(distance c_pt2 px3))
  104.       (or(< (* b_hd 2) ds1 ) (= b_hd 0)))
  105.        (progn
  106.          (setq elist1(entget e1)
  107.          elist2(entget e2)
  108.          elist3(subst(cons 11 px2)(assoc 11 elist1)elist1)
  109.          elist4(subst(cons 11 px4)(assoc 11 elist2)elist2))
  110.          (entmod(subst(cons 10 px1)(assoc 10 elist1)elist1))
  111.          (entmod(subst(cons 10 px3)(assoc 10 elist2)elist2))
  112.          (entmake elist3)
  113.          (entmake elist4)
  114.          (setvar 'cmdecho 0)
  115.          (setq e1_lay (sk_dxf e1 8)
  116.          e1_col (sk_dxf e1 62)
  117.          e1_lt (sk_dxf e1 6)
  118.          e1_lts (sk_dxf e1 48)
  119.          e1_lw (sk_dxf e1 370))         
  120.          (setq pl1(sk_mkpl02 lst1 e1_lay e1_col e1_lt e1_lts e1_lw)
  121.          pl2(sk_mkpl02 lst2 e1_lay e1_col e1_lt e1_lts e1_lw))
  122.          (if(zerop b_hd)
  123.      (princ)
  124.      (progn
  125.        (setq pl3(sk_mkpl02 lst3 e1_lay e1_col e1_lt e1_lts e1_lw)
  126.        pl4(sk_mkpl02 lst4 e1_lay e1_col e1_lt e1_lts e1_lw))      
  127.        (command "_.move" pl3 pl4 "" "_non" "0,0" "_non" cmpt)
  128.        (command "_.rotate" pl3 pl4 "" "_non" cmpt "r" "_non" cmpt "_non" (polar cmpt (* 0.5 pi) 1)  "_non" c_pt1)
  129.        (command "_.scale" pl3 pl4 "" "_non" cmpt ds1)
  130.        (command "_.scale" pl3  "" (polar cmpt (+ ang1(* 1.5 pi)) (* 0.175 ds1)) "r" "_non" ds1 "_non" (- ds1 (* b_hd 2)))
  131.        (command "_.scale" pl4 "" (polar cmpt (+ ang1(* 0.5 pi)) (* 0.175 ds1)) "r" "_non" ds1 "_non" (- ds1 (* b_hd 2)))
  132.        )
  133.      )         
  134.          (command "_.move" pl1 pl2 "" "_non" "0,0" "_non" cmpt)         
  135.          (command "_.rotate" pl1 pl2 "" "_non" cmpt "r" "_non" cmpt "_non" (polar cmpt (* 0.5 pi) 1)  "_non" c_pt1)
  136.          (command "_.scale" pl1 pl2  "" "_non" cmpt ds1)         
  137.          (setvar 'cmdecho 1)
  138.        )
  139.        (princ "\n截面距离不够,无法生成.")
  140.        )
  141.       
  142.      )
  143.      )
  144.    )
  145.   ((and (sk_ty (car en1)'("lwpolyline"))
  146.         (sk_ty (car en2)'("lwpolyline"))
  147.         (=(sk_dxf (car en1) 5)(sk_dxf (car en2) 5)))
  148.    (princ "\n多段线.")
  149.    (setq p0(cadr en1)
  150.          p00(cadr en2)
  151.          e1(car en1)         
  152.          obj(vlax-ename->vla-object e1)
  153.          p0x(vlax-curve-getClosestPointTo obj p0)
  154.          p00x(vlax-curve-getClosestPointTo obj p00)
  155.          index0(fix(vlax-curve-getParamAtPoint obj p0x))
  156.          index00(fix(vlax-curve-getParamAtPoint obj p00x))
  157.          indexend(fix(vlax-curve-getEndParam obj))
  158.          )
  159.    (if (vlax-curve-isClosed obj)
  160.      (setq indexend(1- indexend))     
  161.      )
  162.    (setq index0+ (if (= index0 indexend) 0 (1+ index0) ))
  163.    (setq index00+ (if (= index00 indexend) 0 (1+ index00) ))
  164.    (setq p1(vlax-safearray->list(vlax-variant-value(vla-get-Coordinate obj index0)))
  165.          p2(vlax-safearray->list(vlax-variant-value(vla-get-Coordinate obj index0+)))
  166.          p3(vlax-safearray->list(vlax-variant-value(vla-get-Coordinate obj index00)))
  167.          p4(vlax-safearray->list(vlax-variant-value(vla-get-Coordinate obj index00+)))
  168.          c_pt1(PerToLine p0 p1 p2)
  169.          c_pt2(PerToLine p0 p3 p4)
  170.          ang1 (angle c_pt1 c_pt2)
  171.          cmpt(mapcar'(lambda(x y)(* 0.5(+ x y))) c_pt1 c_pt2)
  172.          )
  173.    
  174.    (if (or(not(>(distance c_pt1 c_pt2) 0))(inters p1 p2 p3 p4 nil))
  175.      (princ "\n两条直线不平行.")
  176.      (progn
  177.        (princ "\n平行直线.")      
  178.        (setq ds1 (distance c_pt1 c_pt2)
  179.        px1(polar c_pt1 (angle p1 p2) (* 0.175 ds1))
  180.        px2(polar c_pt1 (angle p2 p1) (* 0.175 ds1))
  181.        px3(polar c_pt2 (angle p3 p4) (* 0.175 ds1))
  182.        px4(polar c_pt2 (angle p4 p3) (* 0.175 ds1))
  183.        )
  184.        (if(setq b_hd (getreal (strcat "\n输入壁厚(0/小于当前半径" (rtos (* 0.5 ds1) 2 ) "):")))(princ)(setq b_hd 0))
  185.        (if
  186.        (and b_hd
  187.       (> (distance c_pt1 p1)(distance c_pt1 px2))
  188.       (> (distance c_pt1 p2)(distance c_pt1 px1))
  189.       (> (distance c_pt2 p3)(distance c_pt2 px4))
  190.       (> (distance c_pt2 p4)(distance c_pt2 px3))
  191.       (or(< (* b_hd 2) ds1 ) (= b_hd 0)))
  192.        (progn
  193.          (setvar 'cmdecho 0)
  194.          (setq e1_lay (sk_dxf e1 8)
  195.          e1_col (sk_dxf e1 62)
  196.          e1_lt (sk_dxf e1 6)
  197.          e1_lts (sk_dxf e1 48)
  198.          e1_lw (sk_dxf e1 370))
  199.          (setq elast1(entlast))
  200.          (command "_.break" e1 "_non" px1 "_non" px2)
  201.          (setq elast2(entlast))
  202.          (command "_.break" e1 "_non" px3 "_non" px4)
  203.          (if (/= (sk_dxf elast1 5)(sk_dxf elast2 5))
  204.          (command "_.break" elast2 "_non" px3 "_non" px4))
  205.          (setq pl1(sk_mkpl02 lst1 e1_lay e1_col e1_lt e1_lts e1_lw)
  206.          pl2(sk_mkpl02 lst2 e1_lay e1_col e1_lt e1_lts e1_lw))
  207.          (if(zerop b_hd)
  208.      (princ)
  209.      (progn
  210.        (setq pl3(sk_mkpl02 lst3 e1_lay e1_col e1_lt e1_lts e1_lw)
  211.        pl4(sk_mkpl02 lst4 e1_lay e1_col e1_lt e1_lts e1_lw))      
  212.        (command "_.move" pl3 pl4 "" "_non" "0,0" "_non" cmpt)
  213.        (command "_.rotate" pl3 pl4 "" "_non" cmpt "r" "_non" cmpt "_non" (polar cmpt (* 0.5 pi) 1)  "_non" c_pt1)
  214.        (command "_.scale" pl3 pl4 "" "_non" cmpt ds1)
  215.        (command "_.scale" pl3  "" (polar cmpt (+ ang1(* 1.5 pi)) (* 0.175 ds1)) "r" "_non" ds1 "_non" (- ds1 (* b_hd 2)))
  216.        (command "_.scale" pl4 "" (polar cmpt (+ ang1(* 0.5 pi)) (* 0.175 ds1)) "r" "_non" ds1 "_non" (- ds1 (* b_hd 2)))
  217.        )
  218.      )         
  219.          (command "_.move" pl1 pl2 "" "_non" "0,0" "_non" cmpt)         
  220.          (command "_.rotate" pl1 pl2 "" "_non" cmpt "r" "_non" cmpt "_non" (polar cmpt (* 0.5 pi) 1)  "_non" c_pt1)
  221.          (command "_.scale" pl1 pl2  "" "_non" cmpt ds1)         
  222.          (setvar 'cmdecho 1)
  223.        )
  224.        (princ "\n截面距离不够,无法生成.")
  225.        )      
  226.      )
  227.      )
  228.    )
  229.   (t (princ"\n选择无效,无法生成,请选择平行直线或同一条多段线上的平行线。"))
  230.   );cond
  231.       )        
  232.     )
  233.   (progn
  234.       (and en1(redraw (car en1) 4))
  235.       (and en2(redraw (car en2) 4))
  236.       )
  237.   (vla-EndUndoMark(vla-get-ActiveDocument (vlax-get-acad-object)))
  238.   (if *error*_jdx0(setq *error* *error*_jdx0))
  239.   (princ)
  240.   )

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
lucas_3333 + 1 哈哈,E大,第一个支持你!谢谢

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2018-3-26 17:08:35 | 显示全部楼层
学习了谢谢!
发表于 2014-5-26 16:40:22 | 显示全部楼层
感谢E大的源码
发表于 2014-5-26 18:31:08 | 显示全部楼层
感谢分享源码~
有时候还是会用到~
发表于 2014-5-26 19:37:49 | 显示全部楼层
感谢分享好的程序
发表于 2014-5-26 19:47:01 | 显示全部楼层
很实用的程序啊
发表于 2014-5-27 07:47:35 | 显示全部楼层
轴截断面,管道截断面图要的就是这个效果,感谢楼主的无私奉献!
发表于 2014-5-27 07:53:03 | 显示全部楼层
学习,谢谢!
发表于 2014-5-28 08:47:42 | 显示全部楼层
非常棒,感谢楼主!
发表于 2014-5-28 16:09:28 | 显示全部楼层
感谢 edata 分享程序!
发表于 2014-5-28 19:40:37 | 显示全部楼层
感谢楼主分享。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-19 19:26 , Processed in 0.201705 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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