cadmando2 发表于 2022-7-12 08:16:42

使用centerlin绘制二维管道

有了这个lisp例程的问题,同事被甩在了后面!
它工作,但层和不给管道中心线的长度?
有人能帮忙吗!
 
 
 
(定义c:DP-2(/olayer lay_name A B c D E N1 N2 pnt11 pnt12 mssg dist dist2实体总数)
; 加载vla命令集
(vl load com)
; 访问图形屏幕而不是文本屏幕
(图表)
; 记住当前层
(setq olayer(getvar“clayer”))
; 定义程序中的层
(命令“layer”“m”“3”“c”“2”“”“lt”“Center”“”“”)
(命令“layer”“m”“2”“c”“red”“”“lt”“Hidden”“”“”)
(命令“layer”“m”“15”“c”“30”“lt”“Continuous”“”“”)
(setvar“clayer”olayer)
; 让用户指定OD和ID
(setq P-OD(getreal“\n输入管道外径:”)
(setq P-ID(getreal“\n输入管道内径:”)
(setq P-OD_2(/P-OD 2))
(setq P-ID_2(/P-ID 2))
;| 部分被阻止
; 这部分仅过滤层PC上的线
(setq lay_名称“PC”)
; 注意:ssget“X”甚至可以选择关闭、锁定或冻结层上的对象!
(setq A(ssget“X”)
(列表(cons 0“线”)(cons 8 lay_名称)
           )
   );setq A
; 端部堵塞
|;
(princ“\n警告!圆弧/样条CL返回的长度不正确。\n选择要构造管道的中心线:”)
(setq A(ssget))
;变量B知道在变量A中找到了多少个对象
(setq B(sslength A))
(setq C 0);柜台
; 当C=B时,循环结束
(while(<C B)
; 证明计算机工作的命令行动画:
(defun微调杆(sbar)
(条件
(=sbar“\\”、“|”)
((=sbar“|”)/)
((=sbar”/“-”)
(t“\\”)
      );康德
   );德芬
(princ(strcat“\r设置管道实体”(setq sbar(spinbar sbar)))
; D被分配给在子集中找到的下一个实体
(setq D(ssname A C))
(initget(+1 2 4 64))
(setq odist P-OD_2);偏移距离
(setq idist P-ID_2);偏移距离
; D是实体,但必须视为要偏移的对象
(setq D(vlax ename->vla对象D))
; D是在管道层上的两个方向上的偏移量
(vla偏移D idist)
(setq实体(entlast)
实体(entget实体)
实体(subst(cons 8“锅炉管道ID”)
(assoc 8实体)实体)
         );setq公司
(entmod实体)
(vla偏移D(*idist-1))
(setq实体(entlast)
实体(entget实体)
实体(subst(cons 8“2”)
(assoc 8实体)实体)
         );setq公司
(entmod实体)
(vla偏移D odist)
(setq实体(entlast)
实体(entget实体)
实体(subst(cons 8“15”)
(assoc 8实体)实体)
         );setq公司
(entmod实体)
(vla偏移D(*odist-1))
(setq实体(entlast)
实体(entget实体)
实体(subst(cons 8“15”)
(assoc 8实体)实体)
         );setq公司
(entmod实体)
(setq C(1+C));在再次测试while循环之前,向计数器添加一个
 ) ;而
; 现在计算相同的选择集总长度(英尺和英寸)。
(setq E(ssget“P”))
(setq总计0)
(setq计数(sslength E))
(同时(/=计数0)
(setq N1(ssname E 0))
(setq N2(entget N1)
N2(subst(cons 8“中心”)
(assoc 8 N2)N2)
        );setq公司
(setq pnt10(cdr(assoc 10 N2)))
(setq pnt11(cdr(assoc 11 N2)))
(setq dist2(距离pnt10 pnt11))
(setq总计(+dist2总计))
(ssdel N1 E)
(entmod N2)
(setq计数(1-计数))
    );结束时
(setq mssg(strcat“完成!“”\n管道长度=“(rtos总计4 2)))
(提示mssg)
(普林斯)
);defun DP-2

BIGAL 发表于 2022-7-12 08:53:15

(princ“\n警告!圆弧/样条CL返回的长度不正确。\n选择要构造管道的中心线:”)
 
用vla get length替换pnt10 pnt11,这样它可以处理带曲线的PLINE。
 
将您的SSGET作为个人保留,这样就不需要一直重新选择。
(setq ASS(ssget“X”(列表(cons 0“线”)(cons 8 lay_名称)));setq ASS
 
在进行偏移时,只需将新偏移添加到选择集SSADD,然后在最后更改属性。(命令“CHPROP”SSNEW1““LAYER”“2”“”)对ssnew2“15”重复

mhupp 发表于 2022-7-12 09:26:19

这里还有一些提示。
 
制作层时减少命令行垃圾邮件在制作层之前和之后关闭cmdecho。
(setvar 'cmdecho 0)
(command "layer" "m" ...
(command "layer" "m" ...
(command "layer" "m" ...
(setvar 'cmdecho 1)
OD和ID的getdist。您可以用鼠标或键入来拾取点,也可以确保OD大于ID。并一次性将它们除以2。
(if (and (setq P-OD (/ (getdist "\n Enter O.D. of Pipe: ") 2)) (setq P-ID (/ (getdist "\n Enter I.D. of Pipe: ") 2)) (> P-OD P-ID))
(progn)
(Progn
    (prompt "\nI.D. Needs to be smaller then O.D.")
    (quit)
)
)
若管道的中心线是多条线,那个么所有连接的弧将连接成一条多段线。
(vl-cmdf "_.Join" A "") ;join everything selected with ssget into one polyline if they are connected
可以用4条vla线路替换entmod的24条线路
(setq off (vla-offset D idist)) ;sets vla-objname of new offset entity
(vla-put-layer off "Boiler-Pipe-ID") ;moves offset entity to layer
 
页: [1]
查看完整版本: 使用centerlin绘制二维管道