乐筑天下

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

[编程交流] 在p上创建直线

[复制链接]

14

主题

40

帖子

26

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 07:20:01 | 显示全部楼层 |阅读模式
你好
 
我参考了随附的由等距线段组成的多段线草图。我需要一个lisp文件,将最适合直线到多段线。随附的是两条多段线的图纸。洋红色多段线应采用lisp例程,最好用直线拟合。
 
谢谢
BSimpson公司
多段线到多段线。pdf
长截面1。图纸
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-6 08:17:25 | 显示全部楼层
以下是我写的内容-创建最适合选定二维多段线的绿线:
 
  1. ;;-------------------=={ List Difference }==------------------;;
  2. ;;                                                            ;;
  3. ;;  Returns items appearing exclusively in one list but not   ;;
  4. ;;  another, i.e. the relative complement: l1 \ l2            ;;
  5. ;;------------------------------------------------------------;;
  6. ;;  Author: Lee Mac, Copyright © 2011 - www.lee-mac.com       ;;
  7. ;;------------------------------------------------------------;;
  8. ;;  Arguments:                                                ;;
  9. ;;  l1,l2 - lists for which to return the difference          ;;
  10. ;;------------------------------------------------------------;;
  11. ;;  Returns:  List of items appearing exclusively in list l1  ;;
  12. ;;------------------------------------------------------------;;
  13. (defun LM:ListDifference ( l1 l2 )
  14. (vl-remove-if '(lambda ( x ) (member x l2)) l1)
  15. )
  16. (defun prelst ( lst el / f )
  17.   (vl-remove-if '(lambda ( a ) (or f (setq f (equal a el 1e-))) lst)
  18. )
  19. (defun suflst ( lst el )
  20. (cdr (vl-member-if '(lambda ( a ) (equal a el 1e-) lst))
  21. )
  22. (defun c:plbestfit ( / osm q ss pl vert pt ptlst anglst danglst uanglst nths ptlstn p1 p2 p3 p4 p linplst sss )
  23. (setq osm (getvar 'osmode))
  24. (setvar 'osmode 0)
  25. (prompt "\nPick 2d polyline")
  26. (setq q T)
  27. (while q
  28.    (setq ss (ssget "_+.:E:S:L" '((0 . "*POLYLINE"))))
  29.    (if ss
  30.      (if (eq (cdr (assoc 100 (reverse (entget (ssname ss 0))))) "AcDb3dPolyline") (setq q T) (setq q nil))
  31.      (setq q nil)
  32.    )
  33. )
  34. (if (eq (cdr (assoc 0 (entget (setq pl (ssname ss 0))))) "POLYLINE")
  35.    (progn
  36.      (setq vert (entnext pl))
  37.      (setq pt (cdr (assoc 10 (entget vert))))
  38.      (setq ptlst (cons pt ptlst))
  39.      (while (eq (cdr (assoc 0 (entget (setq vert (entnext vert))))) "VERTEX")
  40.        (setq pt (cdr (assoc 10 (entget vert))))
  41.        (setq ptlst (cons pt ptlst))
  42.      )
  43.      (setq ptlst (reverse ptlst))
  44.    )
  45. )
  46. (if (eq (cdr (assoc 0 (entget (setq pl (ssname ss 0))))) "LWPOLYLINE")
  47.    (progn
  48.      (command "_.convertpoly" "H" pl "")
  49.      (setq vert (entnext pl))
  50.      (setq pt (cdr (assoc 10 (entget vert))))
  51.      (setq ptlst (cons pt ptlst))
  52.      (while (eq (cdr (assoc 0 (entget (setq vert (entnext vert))))) "VERTEX")
  53.        (setq pt (cdr (assoc 10 (entget vert))))
  54.        (setq ptlst (cons pt ptlst))
  55.      )
  56.      (setq ptlst (reverse ptlst))
  57.      (command "_.convertpoly" "L" pl "")
  58.    )
  59. )
  60. (setq ptlst (acet-list-remove-duplicates ptlst 1e-2))
  61. (setq anglst (mapcar '(lambda (a b) (angle a b)) ptlst (cdr ptlst)))
  62. (foreach ang anglst
  63.    (cond ((<= (* 1.5 pi) ang (* 2.0 pi)) (setq danglst (cons ang danglst)))
  64.          ((<= 0.0 ang (* 0.5 pi)) (setq uanglst (cons ang uanglst)))
  65.    )
  66. )
  67. (setq danglst (reverse danglst) uanglst (reverse uanglst))
  68. (defun nthsegang ( anglst danglst uanglst / seglst1 seg1ang s1 seglst2 seg2ang s2 )
  69.    (if (equal (car danglst) (car anglst) 1e- (setq seglst1 (prelst anglst (car uanglst))))
  70.    (if (equal (car uanglst) (car anglst) 1e- (setq seglst2 (prelst anglst (car danglst))))
  71.    (setq s1 (length seglst1) s2 (length seglst2))
  72.    (setq sss (+ (if (null sss) 0 sss) s1 s2))
  73.    (if seglst1 (setq seg1ang (car (vl-sort seglst1 '<=))))
  74.    (if seglst2 (setq seg2ang (car (vl-sort seglst2 '>=))))
  75.    (if seglst1 (setq danglst (LM:ListDifference danglst seglst1) anglst (LM:ListDifference anglst seglst1)))
  76.    (if seglst2 (setq uanglst (LM:ListDifference uanglst seglst2) anglst (LM:ListDifference anglst seglst2)))
  77.    (if seglst1 (if (null nths) (setq nths (cons (+ (length (prelst seglst1 seg1ang)) 1) nths)) (setq nths (cons (+ sss (- s1) (- s2) (length (prelst seglst1 seg1ang)) 1) nths))))
  78.    (if seglst2 (if (null nths) (setq nths (cons (+ (length (prelst seglst2 seg2ang)) 1) nths)) (setq nths (cons (+ sss (- s1) (- s2) (length (prelst seglst2 seg2ang)) 1) nths))))
  79.    (if anglst (nthsegang anglst danglst uanglst))
  80.    nths
  81. )
  82. (setq nths (reverse (nthsegang anglst danglst uanglst)))
  83. (foreach n nths
  84.    (setq ptlstn (cons (nth (- n 1) ptlst) ptlstn) ptlstn (cons (nth n ptlst) ptlstn))
  85. )
  86. (setq ptlstn (reverse ptlstn))
  87. (while (> (length ptlstn) 2)
  88.    (setq p1 (car ptlstn) p2 (cadr ptlstn) p3 (caddr ptlstn) p4 (cadddr ptlstn))
  89.    (setq p (inters p1 p2 p3 p4 nil))
  90.    (setq linplst (cons p linplst))
  91.    (setq ptlstn (cddr ptlstn))
  92. )
  93. (setq linplst (reverse linplst))
  94. (while (> (length linplst) 1)
  95.    (setq p1 (car linplst) p2 (cadr linplst))
  96.    (entmake (list '(0 . "LINE") '(62 . 3) (cons 10 p1) (cons 11 p2)))
  97.    (setq linplst (cdr linplst))
  98. )
  99.      
  100. (setvar 'osmode osm)
  101. (princ)
  102. )

 
或者,您可以将直线转换为多段线-pedit、multiple、select lines、join。。。
 
M、 R。
回复

使用道具 举报

14

主题

40

帖子

26

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 08:44:58 | 显示全部楼层
你好,Marco_ribar,
 
lisp工作得很好,但当我尝试更长的多段线时,我得到了以下错误消息;
 
选择对象:找到1个
选择对象:转换1个多段线对象。
命令:_。convertpoly输入多段线转换选项[重/轻]:L
选择对象:找到1个
选择对象:转换1个多段线对象。
命令:发生硬错误***
达到内部堆栈限制(模拟)
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-10 04:44 , Processed in 0.480417 second(s), 58 queries .

© 2020-2025 乐筑天下

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