乐筑天下

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

[编程交流] 在内部或外部偏移多段线

[复制链接]

145

主题

590

帖子

446

银币

中流砥柱

Rank: 25

铜币
725
发表于 2022-7-5 16:38:21 | 显示全部楼层 |阅读模式
大家好,
 
我发现这段代码在内部偏移了一条多段线。这似乎表明,通过将符号从-改为+可以从内部切换到外部。
 
我已经花了几个小时尝试不同的事情,但无法让它发挥作用。
我试图将其集成到一个更大的lisp中,该lisp将偏移多段线outisde,然后在该多段线上拾取一个点,并将该点与原始多段线一起馈送到Extrim中,以切断围栏外的所有内容。
 
有人能帮忙把它搬到外面去吗?
此外,代码不会在任何地方声明“选择对象”。这显然不是香草Lisp程序。是否可以解释所选对象在代码中的位置?
 
提前谢谢。
 
  1. ;;;Eugeni Elpanov
  2. ;;; Arguments
  3. ;;;         lw - ename or vla object of polyline
  4. ;;; Return
  5. ;;;     t - clockwise
  6. ;;;    nil - counter-clockwise
  7. (defun lib:pline_clockwise ( lw  / LST MAXP MINP)
  8. (if (= (type lw) 'ENAME)
  9.    (setq lw (vlax-ename->vla-object lw)))  
  10. (vla-GetBoundingBox lw 'MinP 'MaxP)
  11. (setq
  12. minp(vlax-safearray->list minp)
  13. MaxP(vlax-safearray->list MaxP)
  14. lst(mapcar(function(lambda(x)
  15. (vlax-curve-getParamAtPoint lw
  16. (vlax-curve-getClosestPointTo lw x))))
  17. (list minp(list(car minp)(cadr MaxP))
  18. MaxP(list(car MaxP)(cadr minp)))))
  19. (if(or
  20. (<=(car lst)(cadr lst)(caddr lst)(cadddr lst))
  21. (<=(cadr lst)(caddr lst)(cadddr lst)(car lst))
  22. (<=(caddr lst)(cadddr lst)(car lst)(cadr lst))
  23. (<=(cadddr lst)(car lst)(cadr lst)(caddr lst))) t nil))
  24. (defun C:OFF40 ( )
  25. (vl-load-com)
  26. (if  
  27. (and
  28. (setq en (car(entsel)))
  29. (wcmatch (cdr(assoc 0 (entget en))) "*POLYLINE")
  30. (or (initget 7) t)
  31. (setq d (getdist "\nOffset distanse: "))
  32. (setq en (vlax-ename->vla-object en))
  33. (vlax-write-enabled-p en)
  34. (vlax-method-applicable-p en 'Offset)
  35. (if (lib:pline_clockwise en)
  36.    d
  37.    (setq d (- 0 d))  ;_ Plus or minus To change a sign
  38.    )
  39. (setq i 1)
  40. (repeat 40
  41.    (vl-catch-all-apply
  42.      '(lambda()
  43.         (vla-offset en (* i d))
  44.         (setq i (1+ i))
  45.         )
  46.      )
  47.    )
  48. )
  49. (princ " Offset OK")
  50. (princ "Not a polyline or on locket layer")
  51. )
  52. (princ)
  53. )

 
我在这里找到了代码:
http://forums.augi.com/showthread.php?83935-创建列表多段线顶点
 
 
这是输出:
LWPOLYLINE3DC1AcDbEntity0Model0AcDbPolyline310.00.00.0(166.615 343.075)0.00
 
它给了coord,但还有一大堆我不想要的东西。我怎样才能隔离它?
回复

使用道具 举报

145

主题

590

帖子

446

银币

中流砥柱

Rank: 25

铜币
725
发表于 2022-7-5 16:42:15 | 显示全部楼层
试试看。对不起,我英语不好。
plpoint。lsp
回复

使用道具 举报

145

主题

590

帖子

446

银币

中流砥柱

Rank: 25

铜币
725
发表于 2022-7-5 16:45:49 | 显示全部楼层
谢谢1985,但我得到的结果是:
 
  1. (defun c:plpoint ( )
  2. (SETQ LP1 1)
  3. (WHILE LP1
  4. (PROMPT "\nSelect polyline boundary: ")
  5. (SETQ PSS (SSGET ":S" '((0 . "LWPOLYLINE"))))
  6. (IF (/= PSS NIL) (SETQ LP1 NIL) (PROMPT "\nNO POLYLINE SELECTED, TRY AGAIN. "))
  7. );END LP1
  8. (SETQ PEN (SSNAME PSS 0))
  9. (SETQ PENL (ENTGET PEN))
  10. (SETQ PPL (LIST))
  11. (FOREACH N PENL
  12. (PROGN
  13.   (SETQ PPA (CAR N))
  14.   (SETQ PPV (CDR N))
  15.   (princ PPV)
  16.   ;(IF (= PPA 10) (SETQ PPL (APPEND PPL (LIST PPV))))
  17. ));END N
  18. ;(SETQ SHSS (SSGET "WP" PPL '((0 . "INSERT") (8 . "L-Irr-Sprayhead"))))
  19. )

 
我只需要把它丢给coords。
 
我希望你能理解我的英语。
173827ojjq4d3j3j7dzed4.jpg
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 16:49:20 | 显示全部楼层
PPV变量只包含一个点的坐标,即直线的起点。运行此选项。在命令提示下,显示特征PRINC的双组坐标。
plpoint。lsp
回复

使用道具 举报

145

主题

590

帖子

446

银币

中流砥柱

Rank: 25

铜币
725
发表于 2022-7-5 16:53:22 | 显示全部楼层
  1. (166.615 343.075 0.0)(166.615 343.075 0.0)
回复

使用道具 举报

0

主题

19

帖子

21

银币

限制会员

铜币
-2
发表于 2022-7-5 16:55:52 | 显示全部楼层
谢谢1958年
 
如果我试着使用下面的坐标,它不会起作用。
 
  1. (defun c:plpoint (/)
  2. (vl-load-com)
  3. (setq LP1 1)
  4. (while LP1
  5. (prompt "\nSelect polyline boundary: ")
  6. (setq PSS (ssget "_:S" '((0 . "LWPOLYLINE"))))
  7. (if (/= PSS nil)
  8.   (setq LP1 nil)
  9.   (prompt "\nNO POLYLINE SELECTED, TRY AGAIN. ")
  10. )
  11. )
  12. (setq PPV (vlax-curve-getStartPoint (vlax-ename->vla-object (ssname PSS 0))))
  13. (vl-princ-to-string PPV)
  14. )

 
我希望能够将坐标传递给另一个lisp。
 
这能做到吗?
回复

使用道具 举报

145

主题

590

帖子

446

银币

中流砥柱

Rank: 25

铜币
725
发表于 2022-7-5 16:58:07 | 显示全部楼层
如果只是寻找第一个顶点,也可以使用:
 
  1. (defun c:plpoint (/)
  2. (vl-load-com)
  3. (setq LP1 1)
  4. (while LP1
  5. (prompt "\nSelect polyline boundary: ")
  6. (setq PSS (ssget "_:S" '((0 . "LWPOLYLINE"))))
  7. (if (/= PSS nil)
  8.   (setq LP1 nil)
  9.   (prompt "\nNO POLYLINE SELECTED, TRY AGAIN. ")
  10. )
  11. )
  12. (setq PPV (vlax-curve-getStartPoint (vlax-ename->vla-object (ssname PSS 0))))
  13. (vl-princ-to-string PPV)
  14. [color="red"] (command "_circle" PPV "3")[/color]
  15. )
回复

使用道具 举报

0

主题

19

帖子

21

银币

限制会员

铜币
-2
发表于 2022-7-5 17:01:22 | 显示全部楼层
谢谢BKT。完全按照我的要求做了。。。。。
回复

使用道具 举报

0

主题

19

帖子

21

银币

限制会员

铜币
-2
发表于 2022-7-5 17:04:52 | 显示全部楼层
很高兴它对你有用!
回复

使用道具 举报

145

主题

590

帖子

446

银币

中流砥柱

Rank: 25

铜币
725
发表于 2022-7-5 17:07:38 | 显示全部楼层
Woodman78这里是V形。lsp接近于匹配您的图表。
 
  1. (defun c:test ()
  2. (setq ppv (cdr (assoc 10 (entget (car (entsel "\nSelect Polyline: "))))))
  3. (command "_circle" PPV "3")
  4. (princ ppv)
  5. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 14:05 , Processed in 0.618148 second(s), 74 queries .

© 2020-2025 乐筑天下

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