乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 122|回复: 2

[编程交流] 使用centerlin绘制二维管道

[复制链接]

38

主题

83

帖子

53

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
186
发表于 2022-7-12 08:16:42 | 显示全部楼层 |阅读模式
有了这个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
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 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”重复
回复

使用道具 举报

15

主题

1052

帖子

58

银币

中流砥柱

Rank: 25

铜币
683
发表于 2022-7-12 09:26:19 | 显示全部楼层
这里还有一些提示。
 
制作层时减少命令行垃圾邮件在制作层之前和之后关闭cmdecho。
  1. (setvar 'cmdecho 0)  
  2. (command "layer" "m" ...
  3. (command "layer" "m" ...
  4. (command "layer" "m" ...
  5. (setvar 'cmdecho 1)  

OD和ID的getdist。您可以用鼠标或键入来拾取点,也可以确保OD大于ID。并一次性将它们除以2。
  1. (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))
  2.   (progn)
  3.   (Progn
  4.     (prompt "\nI.D. Needs to be smaller then O.D.")
  5.     (quit)
  6.   )
  7. )

若管道的中心线是多条线,那个么所有连接的弧将连接成一条多段线。
  1. (vl-cmdf "_.Join" A "") ;join everything selected with ssget into one polyline if they are connected

可以用4条vla线路替换entmod的24条线路
  1. (setq off (vla-offset D idist)) ;sets vla-objname of new offset entity
  2. (vla-put-layer off "Boiler-Pipe-ID") ;moves offset entity to layer

 
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-1-31 15:51 , Processed in 0.278179 second(s), 69 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表