乐筑天下

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

[编程交流] Q、 修剪多条多段线

[复制链接]

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 12:50:36 | 显示全部楼层 |阅读模式
我必须在一个配置文件中绘制灰色线,并修剪它们,如第一个附加的jpeg所示。
 
不同颜色的线是多段线。基本上,EXTRIM可以完成一半的工作,因为它不允许您选择多条多段线。
 
使用线程“折线顶点”中发布的修改代码,我尝试了为单个水平线制作一些东西。
 
基本上,这段代码会找到沿单个选定水平线的所有交点,然后每隔2个交点绘制一条新线,然后删除旧线。
 
当代码正确时,我将让程序创建水平线,并将此代码应用于每一条。
 
目前存在的问题:
[列表]
  • 我必须按顺序选择多段线。这是一个问题,因为最终我想自动选择这些普林斯过滤层“地线”。
  • 如果第一条多段线中的初始线从上到右下,则绘制的线将与我想要的相反(请参见第二张图像(Profile2))。
    你认为这是解决这个问题的最好办法吗?
    谢谢大家的帮助。
    附加图像https://www.cadtutor.net/forum/attachment.php?attachmentid=12827&stc=1&d=1246245669[/img]

                                   
    登录/注册后可看大图
  • 回复

    使用道具 举报

    5

    主题

    32

    帖子

    27

    银币

    初来乍到

    Rank: 1

    铜币
    25
    发表于 2022-7-6 12:54:06 | 显示全部楼层
    很好的工具,不能给你太多的帮助在Lisp程序,但我会遵循这一点,因为我可以使用这样的工具了。
    回复

    使用道具 举报

    114

    主题

    1万

    帖子

    1万

    银币

    中流砥柱

    Rank: 25

    铜币
    543
    发表于 2022-7-6 12:58:55 | 显示全部楼层
    试着用另一种方法
     
    1. (defun c:Int  (/ lne lObj ss int Objlst par lst ang)
    2. (vl-load-com)
    3. (setq doc (vla-get-ActiveDocument
    4.              (vlax-get-Acad-Object))
    5.        spc (if (zerop (vla-get-activespace doc))
    6.              (if (= (vla-get-mspace doc) :vlax-true)
    7.                (vla-get-modelspace doc)
    8.                (vla-get-paperspace doc))
    9.              (vla-get-modelspace doc)))
    10. (while
    11.    (progn
    12.      (setq lne (car (entsel "\nSelect Horizontal Line: ")))
    13.      (cond ((eq 'ENAME (type lne))
    14.             (if (eq "LINE" (dxf 0 lne))
    15.               (if (zerop (- (cadr (dxf 11 lne)) (cadr (dxf 10 lne))))
    16.                 (progn
    17.                   (setq lObj (vlax-ename->vla-object lne))
    18.                   nil)
    19.                 (princ "\n** Line is not Horizontal **"))
    20.               (princ "\n** Object is not a Line **")))
    21.            (t (princ "\n** Nothing Selected **")))))
    22. (princ "\nSelect Polylines: ")
    23. (while (not ss)
    24.    (setq ss (ssget '((0 . "LWPOLYLINE")))))
    25. (setq int
    26.    (vl-sort
    27.      (apply 'append
    28.        (vl-remove-if 'null
    29.          (mapcar
    30.            (function
    31.              (lambda (Obj)
    32.                (vlax-lst->3D-point
    33.                  (vlax-invoke lObj
    34.                    'Intersectwith Obj acExtendNone))))
    35.                       (setq Objlst
    36.                         (mapcar 'vlax-ename->vla-object
    37.                           (vl-remove-if 'listp
    38.                             (mapcar 'cadr (ssnamex ss))))))))
    39.              (function
    40.                (lambda (a b)
    41.                  (< (car a) (car b))))) lst Objlst)
    42. (while
    43.    (and (setq Obj (car lst))
    44.         (not
    45.           (setq par
    46.             (vlax-curve-getParamatPoint Obj (car int)))))
    47.     (setq lst (cdr lst)))
    48. (setq ang
    49.    (angle '(0 0 0)
    50.      (vlax-curve-getFirstDeriv Obj par)))
    51. (if (or (< (/ pi 2.) ang pi)
    52.          (< (/ (* 3 pi) 2.) ang))
    53.    (setq int (cdr int)))
    54. (setq lst Objlst)
    55. (while
    56.    (and (setq Obj (car lst))
    57.         (not
    58.           (setq par
    59.             (vlax-curve-getParamatPoint Obj (last int)))))
    60.     (setq lst (cdr lst)))
    61. (setq ang
    62.    (angle '(0 0 0)
    63.      (vlax-curve-getFirstDeriv Obj par)))
    64. (if (or (> (/ pi 2.) ang 0.)
    65.          (< pi ang (/ (* 3 pi) 2.)))
    66.    (setq int
    67.      (reverse
    68.        (cdr
    69.          (reverse int)))))
    70. (setq int
    71.    (mapcar 'vlax-3D-point int))
    72. (while (cadr int)
    73.    (vla-addLine spc
    74.      (car int) (cadr int))
    75.    (setq int (cddr int)))
    76. (vla-delete lObj)
    77. (princ))
    78. (defun dxf  (code ent)
    79. (cdr (assoc code (entget ent))))
    80. (defun vlax-lst->3D-point  (lst)
    81. (if lst
    82.    (cons (list (car lst) (cadr lst) (caddr lst))
    83.          (vlax-lst->3D-point (cdddr lst)))))

     
    不必按顺序选择多段线
    回复

    使用道具 举报

    14

    主题

    271

    帖子

    257

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    70
    发表于 2022-7-6 13:03:13 | 显示全部楼层
    正如所料,它工作得很好。谢谢伙计
    要是我懂vlisp就好了!我下载了《VLISP开发者圣经》,也许有一天我会。。。
    现在,我希望有了所有这些vlisp,如果我将其插入autolisp代码中,这将无关紧要。
    回复

    使用道具 举报

    114

    主题

    1万

    帖子

    1万

    银币

    中流砥柱

    Rank: 25

    铜币
    543
    发表于 2022-7-6 13:05:01 | 显示全部楼层
     
    是的,我很高兴它对你有用。
     
    回复

    使用道具 举报

    14

    主题

    271

    帖子

    257

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    70
    发表于 2022-7-6 13:09:23 | 显示全部楼层
    好的,使用代码并将其应用于选择集相当容易。如果其他人感兴趣,请点击这里:
     
    1. (defun c:Int2  (/ i lne lObj ss_GL ss_grey_lines int Objlst par lst ang)
    2. (vl-load-com)
    3. (setq doc (vla-get-ActiveDocument
    4.              (vlax-get-Acad-Object))
    5.        spc (if (zerop (vla-get-activespace doc))
    6.              (if (= (vla-get-mspace doc) :vlax-true)
    7.                (vla-get-modelspace doc)
    8.                (vla-get-paperspace doc))
    9.              (vla-get-modelspace doc)))
    10. (If (setq ss_grey_lines (ssget "X" (list (cons 0 "LINE") (cons 8 "Profile") (cons 62 )))
    11.    (Progn
    12.      (If (setq ss_GL (ssget "X" (list (cons 0 "POLYLINE") (cons 8 "Ground Line Profile"))))
    13.    (Progn
    14. (setq i -1)
    15.      (while (setq lne (ssname ss_grey_lines (setq i (1+ i))))
    16.    (setq lObj (vlax-ename->vla-object lne))
    17.    
    18. ;;;  (while
    19. ;;;    (progn
    20. ;;;      (setq lne (car (entsel "\nSelect Horizontal Line: ")))
    21. ;;;      (cond ((eq 'ENAME (type lne))
    22. ;;;             (if (eq "LINE" (dxf 0 lne))
    23. ;;;               (if (zerop (- (cadr (dxf 11 lne)) (cadr (dxf 10 lne))))
    24. ;;;                 (progn
    25. ;;;                   (setq lObj (vlax-ename->vla-object lne))
    26. ;;;                   nil)
    27. ;;;                 (princ "\n** Line is not Horizontal **"))
    28. ;;;               (princ "\n** Object is not a Line **")))
    29. ;;;            (t (princ "\n** Nothing Selected **")))))
    30. (setq int
    31.    (vl-sort
    32.      (apply 'append
    33.        (vl-remove-if 'null
    34.          (mapcar
    35.            (function
    36.              (lambda (Obj)
    37.                (vlax-lst->3D-point
    38.                  (vlax-invoke lObj
    39.                    'Intersectwith Obj acExtendNone))))
    40.                       (setq Objlst
    41.                         (mapcar 'vlax-ename->vla-object
    42.                           (vl-remove-if 'listp
    43.                             (mapcar 'cadr (ssnamex ss_GL))))))))
    44.              (function
    45.                (lambda (a b)
    46.                  (< (car a) (car b))))) lst Objlst)
    47. (while
    48.    (and (setq Obj (car lst))
    49.         (not
    50.           (setq par
    51.             (vlax-curve-getParamatPoint Obj (car int)))))
    52.     (setq lst (cdr lst)))
    53. (setq ang
    54.    (angle '(0 0 0)
    55.      (vlax-curve-getFirstDeriv Obj par)))
    56. (if (or (< (/ pi 2.) ang pi)
    57.          (< (/ (* 3 pi) 2.) ang))
    58.    (setq int (cdr int)))
    59. (setq lst Objlst)
    60. (while
    61.    (and (setq Obj (car lst))
    62.         (not
    63.           (setq par
    64.             (vlax-curve-getParamatPoint Obj (last int)))))
    65.     (setq lst (cdr lst)))
    66. (setq ang
    67.    (angle '(0 0 0)
    68.      (vlax-curve-getFirstDeriv Obj par)))
    69. (if (or (> (/ pi 2.) ang 0.)
    70.          (< pi ang (/ (* 3 pi) 2.)))
    71.    (setq int
    72.      (reverse
    73.        (cdr
    74.          (reverse int)))))
    75. (setq int
    76.    (mapcar 'vlax-3D-point int))
    77. (while (cadr int)
    78.    (vla-addLine spc
    79.      (car int) (cadr int))
    80.    (setq int (cddr int)))
    81. (vla-delete lObj)
    82.    ) ; End While
    83. )(Princ "Layer "Ground Line Profile" not found"))
    84.      )(Princ "Grey Lines not found"))
    85. (princ))
    86. (defun dxf  (code ent)
    87. (cdr (assoc code (entget ent))))
    88. (defun vlax-lst->3D-point  (lst)
    89. (if lst
    90.    (cons (list (car lst) (cadr lst) (caddr lst))
    91.          (vlax-lst->3D-point (cdddr lst)))))

     
    我注意到的一点是,它将水平线更改为当前图层和颜色。我还没来得及破译visualLisp,你能给我看看快速修复方法吗?我希望线条保持原来的颜色,即“轮廓”层,颜色8。
    谢谢
    回复

    使用道具 举报

    114

    主题

    1万

    帖子

    1万

    银币

    中流砥柱

    Rank: 25

    铜币
    543
    发表于 2022-7-6 13:12:11 | 显示全部楼层
     
    很高兴史蒂夫有机会亲自修改它
     
    我会帮你的
    回复

    使用道具 举报

    114

    主题

    1万

    帖子

    1万

    银币

    中流砥柱

    Rank: 25

    铜币
    543
    发表于 2022-7-6 13:15:06 | 显示全部楼层
    这应该行得通,尽管它没有太多的错误捕捉方式(如检查线是否水平等),如有必要,可以添加此项。
     
    另外,请记住,您只是收集多段线,而不是LWPolyline,只是想让您知道这一点,因为我不确定这是否是您的意图。
     
    1. (defun c:Int  (/ doc spc ss_grey ss_gl lne
    2.                 lObj ss int Objlst par lst ang)
    3. (vl-load-com)
    4. (setq doc (vla-get-ActiveDocument
    5.              (vlax-get-Acad-Object))
    6.        spc (if (zerop (vla-get-activespace doc))
    7.              (if (= (vla-get-mspace doc) :vlax-true)
    8.                (vla-get-modelspace doc)
    9.                (vla-get-paperspace doc))
    10.              (vla-get-modelspace doc)))
    11. (if (setq ss_grey
    12.        (ssget "_X" '((0 . "LINE") (8 . "Profile") (62 . )))
    13.    (if (setq ss_gl
    14.          (ssget "_X" '((0 . "POLYLINE") (8 . "Ground Line Profile"))))
    15.      (foreach lObj (mapcar 'vlax-ename->vla-object
    16.                      (mapcar 'cadr (ssnamex ss_grey)))  
    17. ;;;  (while
    18. ;;;    (progn
    19. ;;;      (setq lne (car (entsel "\nSelect Horizontal Line: ")))
    20. ;;;      (cond ((eq 'ENAME (type lne))
    21. ;;;             (if (eq "LINE" (dxf 0 lne))
    22. ;;;               (if (zerop (- (cadr (dxf 11 lne)) (cadr (dxf 10 lne))))
    23. ;;;                 (progn
    24. ;;;                   (setq lObj (vlax-ename->vla-object lne))
    25. ;;;                   nil)
    26. ;;;                 (princ "\n** Line is not Horizontal **"))
    27. ;;;               (princ "\n** Object is not a Line **")))
    28. ;;;            (t (princ "\n** Nothing Selected **")))))
    29. ;;;
    30. ;;;  (princ "\nSelect Polylines: ")
    31. ;;;  (while (not ss)
    32. ;;;    (setq ss (ssget '((0 . "LWPOLYLINE")))))
    33.        (setq int
    34.          (vl-sort
    35.            (apply 'append
    36.              (vl-remove-if 'null
    37.                (mapcar
    38.                  (function
    39.                    (lambda (Obj)
    40.                      (vlax-lst->3D-point
    41.                        (vlax-invoke lObj
    42.                          'Intersectwith Obj acExtendNone))))
    43.                             (setq Objlst
    44.                               (mapcar 'vlax-ename->vla-object
    45.                                 (vl-remove-if 'listp
    46.                                   (mapcar 'cadr (ssnamex ss))))))))
    47.                    (function
    48.                      (lambda (a b)
    49.                        (< (car a) (car b))))) lst Objlst)
    50.        (while
    51.          (and (setq Obj (car lst))
    52.               (not
    53.                 (setq par
    54.                   (vlax-curve-getParamatPoint Obj (car int)))))
    55.           (setq lst (cdr lst)))
    56.        (setq ang
    57.          (angle '(0 0 0)
    58.            (vlax-curve-getFirstDeriv Obj par)))
    59.        (if (or (< (/ pi 2.) ang pi)
    60.                (< (/ (* 3 pi) 2.) ang))
    61.          (setq int (cdr int)))
    62.        (setq lst Objlst)
    63.        (while
    64.          (and (setq Obj (car lst))
    65.               (not
    66.                 (setq par
    67.                   (vlax-curve-getParamatPoint Obj (last int)))))
    68.           (setq lst (cdr lst)))
    69.        (setq ang
    70.          (angle '(0 0 0)
    71.            (vlax-curve-getFirstDeriv Obj par)))
    72.        (if (or (> (/ pi 2.) ang 0.)
    73.                (< pi ang (/ (* 3 pi) 2.)))
    74.          (setq int
    75.            (reverse
    76.              (cdr
    77.                (reverse int)))))
    78.        (setq int
    79.          (mapcar 'vlax-3D-point int))
    80.        (while (cadr int)
    81.          (setq nLne
    82.            (vla-addLine spc
    83.              (car int) (cadr int)))
    84.          (vla-put-layer nLne "Profile")
    85.            (vla-put-color nLne
    86.          (setq int (cddr int)))
    87.        (vla-delete lObj))
    88.      (princ "\n<< No Polylines Found >>"))
    89.    (princ "\n<< No Lines Found >>"))
    90. (princ))
    91. (defun dxf  (code ent)
    92. (cdr (assoc code (entget ent))))
    93. (defun vlax-lst->3D-point  (lst)
    94. (if lst
    95.    (cons (list (car lst) (cadr lst) (caddr lst))
    96.          (vlax-lst->3D-point (cdddr lst)))))

     
    回复

    使用道具 举报

    14

    主题

    271

    帖子

    257

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    70
    发表于 2022-7-6 13:16:04 | 显示全部楼层
    在这里,有时选择集中的水平线根本不会与多段线相交。我想不出一个办法来忽略这些台词。。。
    回复

    使用道具 举报

    114

    主题

    1万

    帖子

    1万

    银币

    中流砥柱

    Rank: 25

    铜币
    543
    发表于 2022-7-6 13:22:01 | 显示全部楼层
    啊,当然,我没有考虑到这一点-这应该是原因:
     
    1. 4
    回复

    使用道具 举报

    发表回复

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

    本版积分规则

    • 微信公众平台

    • 扫描访问手机版

    • 点击图片下载手机App

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

    GMT+8, 2025-3-5 03:12 , Processed in 0.657722 second(s), 84 queries .

    © 2020-2025 乐筑天下

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