edata 发表于 2014-5-26 16:29:27

轴截断面,管道截断面 支持同一根多段线

轴截断面,管道截断面 支持同一根多段线


;;轴截断面,管道截断面 支持多段线
;;code by edata @mjtd
;;2014-5-26
(defun sk_mkpl02(lst sk_lay sk_col sk_lt sk_lts sk_lw)
(entmakex
    (append(list '(0 . "LWPOLYLINE")
   '(100 . "AcDbEntity")
   '(100 . "AcDbPolyline")
   (cons 8 (if sk_lay sk_lay (getvar 'clayer)))
   (cons 62 (if sk_col sk_col 256))
   (cons 6 (if sk_lt sk_lt (getvar 'celtype)))
   (cons 48 (if sk_lts sk_lts (getvar 'celtscale)))
   (cons 370 (if sk_lw sk_lw (getvar 'celweight)))
   )
   lst
   )
    )
)
(defun *error*_jdx (msg)
(if *error*_jdx0(setq *error* *error*_jdx0))
(if (wcmatch (strcase msg t) "*break,*cancel*,*exit*,*取消*")
    (if(= (getvar "LOCALE") "CHS")
      (princ "\n用户按了<Esc>强制退出")
      (princ "\nYou cancelled The operation!")
    )
    (princ (strcat "\n" msg))
)
(progn
      (and en1(redraw (car en1) 4))
      (and en2(redraw (car en2) 4))
      )
(if(= (getvar 'cmdecho) 0)(setvar 'cmdecho 1))
(vla-EndUndoMark(vla-get-ActiveDocument (vlax-get-acad-object)))
(princ)
)

;;;计算cp到p1 p2的垂足点
(defun PerToLine(cp p1 p2 / norm)
(setq      norm (mapcar '- p2 p1)
      p1   (trans p1 0 norm)
      cp   (trans cp 0 norm)
      )
(trans (list (car p1) (cadr p1) (caddr cp)) norm 0)
)
(defun sk_ty (ent lst)
(member(cdr(assoc 0 (entget ent)))(mapcar 'strcase lst))
)
(defun sk_dxf(ent code)(cdr(assoc code(entget ent))))
(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+
      indexend lst1 lst2 lst3 lst4 obj p0 p00 p00x p0x p1 p2 p3 p4 pl1 pl2 pl3 pl4 px1 px2 px3 px4 x y
      e1_lay e1_col e1_lt e1_lts e1_lw)
(vl-load-com)
(setq *error*_jdx0 *error*)    ;保存出错处理函数
(setq *error* *error*_jdx)
(vla-StartUndoMark(vla-get-ActiveDocument (vlax-get-acad-object)))
(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)
      (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))
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)
      (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))
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))
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))
)
(command nil)
(if(and(setq en1(entsel "\n请选择第一条线:"))
   (sk_ty (car en1) '("line" "lwpolyline"))
   (car(list t(redraw (car en1) 3)))
   (setq en2(entsel "\n请选择第二条线:"))
   (sk_ty (car en2) '("line" "lwpolyline"))
   (car(list t(redraw (car en2) 3)))
   )
    (progn      
      (cond
((and (sk_ty (car en1)'("line"))
      (sk_ty (car en2)'("line"))
      (/=(sk_dxf (car en1) 5)(sk_dxf (car en2) 5)))
   (setq e1(car en1)
         e2(car en2)
         p0(cadr en1)
         p1(sk_dxf e1 10)
         p2(sk_dxf e1 11)
         p3(sk_dxf e2 10)
         p4(sk_dxf e2 11)         
         c_pt1(PerToLine p0 p1 p2)
         c_pt2(PerToLine p0 p3 p4)
         ang1 (angle c_pt1 c_pt2)
         cmpt(mapcar'(lambda(x y)(* 0.5(+ x y))) c_pt1 c_pt2)
         )
   (if (inters p1 p2 p3 p4 nil)
   (princ "\n两条直线不平行.")
   (progn
       (princ "\n平行直线.")      
       (setq ds1 (distance c_pt1 c_pt2)
       px1(polar c_pt1 (angle p1 p2) (* 0.175 ds1))
       px2(polar c_pt1 (angle p2 p1) (* 0.175 ds1))
       px3(polar c_pt2 (angle p3 p4) (* 0.175 ds1))
       px4(polar c_pt2 (angle p4 p3) (* 0.175 ds1))
       )
       (if(setq b_hd (getreal (strcat "\n输入壁厚(0/小于当前半径" (rtos (* 0.5 ds1) 2 ) "):")))(princ)(setq b_hd 0))
       (if
       (and b_hd
      (> (distance c_pt1 p1)(distance c_pt1 px2))
      (> (distance c_pt1 p2)(distance c_pt1 px1))
      (> (distance c_pt2 p3)(distance c_pt2 px4))
      (> (distance c_pt2 p4)(distance c_pt2 px3))
      (or(< (* b_hd 2) ds1 ) (= b_hd 0)))
       (progn
         (setq elist1(entget e1)
         elist2(entget e2)
         elist3(subst(cons 11 px2)(assoc 11 elist1)elist1)
         elist4(subst(cons 11 px4)(assoc 11 elist2)elist2))
         (entmod(subst(cons 10 px1)(assoc 10 elist1)elist1))
         (entmod(subst(cons 10 px3)(assoc 10 elist2)elist2))
         (entmake elist3)
         (entmake elist4)
         (setvar 'cmdecho 0)
         (setq e1_lay (sk_dxf e1 8)
         e1_col (sk_dxf e1 62)
         e1_lt (sk_dxf e1 6)
         e1_lts (sk_dxf e1 48)
         e1_lw (sk_dxf e1 370))         
         (setq pl1(sk_mkpl02 lst1 e1_lay e1_col e1_lt e1_lts e1_lw)
         pl2(sk_mkpl02 lst2 e1_lay e1_col e1_lt e1_lts e1_lw))
         (if(zerop b_hd)
   (princ)
   (progn
       (setq pl3(sk_mkpl02 lst3 e1_lay e1_col e1_lt e1_lts e1_lw)
       pl4(sk_mkpl02 lst4 e1_lay e1_col e1_lt e1_lts e1_lw))      
       (command "_.move" pl3 pl4 "" "_non" "0,0" "_non" cmpt)
       (command "_.rotate" pl3 pl4 "" "_non" cmpt "r" "_non" cmpt "_non" (polar cmpt (* 0.5 pi) 1)"_non" c_pt1)
       (command "_.scale" pl3 pl4 "" "_non" cmpt ds1)
       (command "_.scale" pl3"" (polar cmpt (+ ang1(* 1.5 pi)) (* 0.175 ds1)) "r" "_non" ds1 "_non" (- ds1 (* b_hd 2)))
       (command "_.scale" pl4 "" (polar cmpt (+ ang1(* 0.5 pi)) (* 0.175 ds1)) "r" "_non" ds1 "_non" (- ds1 (* b_hd 2)))
       )
   )         
         (command "_.move" pl1 pl2 "" "_non" "0,0" "_non" cmpt)         
         (command "_.rotate" pl1 pl2 "" "_non" cmpt "r" "_non" cmpt "_non" (polar cmpt (* 0.5 pi) 1)"_non" c_pt1)
         (command "_.scale" pl1 pl2"" "_non" cmpt ds1)         
         (setvar 'cmdecho 1)
       )
       (princ "\n截面距离不够,无法生成.")
       )
      
   )
   )
   )
((and (sk_ty (car en1)'("lwpolyline"))
      (sk_ty (car en2)'("lwpolyline"))
      (=(sk_dxf (car en1) 5)(sk_dxf (car en2) 5)))
   (princ "\n多段线.")
   (setq p0(cadr en1)
         p00(cadr en2)
         e1(car en1)         
         obj(vlax-ename->vla-object e1)
         p0x(vlax-curve-getClosestPointTo obj p0)
         p00x(vlax-curve-getClosestPointTo obj p00)
         index0(fix(vlax-curve-getParamAtPoint obj p0x))
         index00(fix(vlax-curve-getParamAtPoint obj p00x))
         indexend(fix(vlax-curve-getEndParam obj))
         )
   (if (vlax-curve-isClosed obj)
   (setq indexend(1- indexend))   
   )
   (setq index0+ (if (= index0 indexend) 0 (1+ index0) ))
   (setq index00+ (if (= index00 indexend) 0 (1+ index00) ))
   (setq p1(vlax-safearray->list(vlax-variant-value(vla-get-Coordinate obj index0)))
         p2(vlax-safearray->list(vlax-variant-value(vla-get-Coordinate obj index0+)))
         p3(vlax-safearray->list(vlax-variant-value(vla-get-Coordinate obj index00)))
         p4(vlax-safearray->list(vlax-variant-value(vla-get-Coordinate obj index00+)))
         c_pt1(PerToLine p0 p1 p2)
         c_pt2(PerToLine p0 p3 p4)
         ang1 (angle c_pt1 c_pt2)
         cmpt(mapcar'(lambda(x y)(* 0.5(+ x y))) c_pt1 c_pt2)
         )
   
   (if (or(not(>(distance c_pt1 c_pt2) 0))(inters p1 p2 p3 p4 nil))
   (princ "\n两条直线不平行.")
   (progn
       (princ "\n平行直线.")      
       (setq ds1 (distance c_pt1 c_pt2)
       px1(polar c_pt1 (angle p1 p2) (* 0.175 ds1))
       px2(polar c_pt1 (angle p2 p1) (* 0.175 ds1))
       px3(polar c_pt2 (angle p3 p4) (* 0.175 ds1))
       px4(polar c_pt2 (angle p4 p3) (* 0.175 ds1))
       )
       (if(setq b_hd (getreal (strcat "\n输入壁厚(0/小于当前半径" (rtos (* 0.5 ds1) 2 ) "):")))(princ)(setq b_hd 0))
       (if
       (and b_hd
      (> (distance c_pt1 p1)(distance c_pt1 px2))
      (> (distance c_pt1 p2)(distance c_pt1 px1))
      (> (distance c_pt2 p3)(distance c_pt2 px4))
      (> (distance c_pt2 p4)(distance c_pt2 px3))
      (or(< (* b_hd 2) ds1 ) (= b_hd 0)))
       (progn
         (setvar 'cmdecho 0)
         (setq e1_lay (sk_dxf e1 8)
         e1_col (sk_dxf e1 62)
         e1_lt (sk_dxf e1 6)
         e1_lts (sk_dxf e1 48)
         e1_lw (sk_dxf e1 370))
         (setq elast1(entlast))
         (command "_.break" e1 "_non" px1 "_non" px2)
         (setq elast2(entlast))
         (command "_.break" e1 "_non" px3 "_non" px4)
         (if (/= (sk_dxf elast1 5)(sk_dxf elast2 5))
         (command "_.break" elast2 "_non" px3 "_non" px4))
         (setq pl1(sk_mkpl02 lst1 e1_lay e1_col e1_lt e1_lts e1_lw)
         pl2(sk_mkpl02 lst2 e1_lay e1_col e1_lt e1_lts e1_lw))
         (if(zerop b_hd)
   (princ)
   (progn
       (setq pl3(sk_mkpl02 lst3 e1_lay e1_col e1_lt e1_lts e1_lw)
       pl4(sk_mkpl02 lst4 e1_lay e1_col e1_lt e1_lts e1_lw))      
       (command "_.move" pl3 pl4 "" "_non" "0,0" "_non" cmpt)
       (command "_.rotate" pl3 pl4 "" "_non" cmpt "r" "_non" cmpt "_non" (polar cmpt (* 0.5 pi) 1)"_non" c_pt1)
       (command "_.scale" pl3 pl4 "" "_non" cmpt ds1)
       (command "_.scale" pl3"" (polar cmpt (+ ang1(* 1.5 pi)) (* 0.175 ds1)) "r" "_non" ds1 "_non" (- ds1 (* b_hd 2)))
       (command "_.scale" pl4 "" (polar cmpt (+ ang1(* 0.5 pi)) (* 0.175 ds1)) "r" "_non" ds1 "_non" (- ds1 (* b_hd 2)))
       )
   )         
         (command "_.move" pl1 pl2 "" "_non" "0,0" "_non" cmpt)         
         (command "_.rotate" pl1 pl2 "" "_non" cmpt "r" "_non" cmpt "_non" (polar cmpt (* 0.5 pi) 1)"_non" c_pt1)
         (command "_.scale" pl1 pl2"" "_non" cmpt ds1)         
         (setvar 'cmdecho 1)
       )
       (princ "\n截面距离不够,无法生成.")
       )      
   )
   )
   )
(t (princ"\n选择无效,无法生成,请选择平行直线或同一条多段线上的平行线。"))
);cond
      )      
    )
(progn
      (and en1(redraw (car en1) 4))
      (and en2(redraw (car en2) 4))
      )
(vla-EndUndoMark(vla-get-ActiveDocument (vlax-get-acad-object)))
(if *error*_jdx0(setq *error* *error*_jdx0))
(princ)
)

ljrljr907 发表于 2018-3-26 17:08:35

学习了谢谢!

lucas_3333 发表于 2014-5-26 16:40:22

感谢E大的源码

totoro 发表于 2014-5-26 18:31:08

感谢分享源码~
有时候还是会用到~

phoevana 发表于 2014-5-26 19:37:49

感谢分享好的程序

lostbalance 发表于 2014-5-26 19:47:01

很实用的程序啊

USER2128 发表于 2014-5-27 07:47:35

轴截断面,管道截断面图要的就是这个效果,感谢楼主的无私奉献!

mycad 发表于 2014-5-27 07:53:03

学习,谢谢!

tanle2020 发表于 2014-5-28 08:47:42

非常棒,感谢楼主!

yoyoho 发表于 2014-5-28 16:09:28

感谢 edata 分享程序!

shengyulon 发表于 2014-5-28 19:40:37

感谢楼主分享。。。。
页: [1] 2 3
查看完整版本: 轴截断面,管道截断面 支持同一根多段线