乐筑天下

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

[编程交流] [Lisp]需要“hard”l的帮助

[复制链接]

46

主题

161

帖子

104

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
242
发表于 2022-7-5 17:39:12 | 显示全部楼层 |阅读模式
你好
 
我需要lisp例程的帮助。
要了解我想要实现的目标,请下载所附的dwg文件。
 
让我们开始吧。
 
我的最终目标是获得包含以下数据的列表
((1 17.7656) (2 36.4474) (3 26.4085) (5 59,6297) .... (12 39.9307)(“最后”35.9001)
哪里
1-是从pline开始的第一个块的属性值
17.7656-是指pline的第一个顶点和第一个找到的块之间的距离,该距离沿pline测量
2-是块中下一个属性的值
36.4474-是第一块和第二块之间的距离
5-同上
596297-同上
...
最后-是字符串
35.9001最后选定的块和柱脚末端之间的距离。
 
距离应该通过pline测量(可能使用vlax curve getDistAtPoint)vlax curve getDistAtPoint的参数可能应该由函数vlax curve getClosestPointTo给出,但这只是我的想法。
 
第一个问题,如何获取插入点距离我的多段线小于或等于15(在本例中,这可能是另一个距离)的所有块(在attachet dwg文件中称为“块”)。
 
谢谢你的帮助。
实例图纸
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:49:54 | 显示全部楼层
这是一个开始,你需要使用块的插入点,因为我正在做其他事情,希望在未来几天内发布代码。
 
http://www.cadtutor.net/forum/showthread.php?96642-参考-a-块到道路对齐
回复

使用道具 举报

46

主题

161

帖子

104

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
242
发表于 2022-7-5 17:55:26 | 显示全部楼层
感谢回复BIGAL!
我还发现了这条有用的线索:
http://www.cadtutor.net/forum/showthread.php?30556-在每个交点处创建垂直线
 
下面是我的编码开始。
我的第一个问题解决了-我有一个插入点距离小于或等于给定距离的块实体名称列表。
 
是时候问第二个问题了。。。如何获取最终列表?
我将在星期一回到这个话题。
 
同时,如果有人能给我关于第一部分的意见,我将不胜感激!
另外,请向我解释GetPerpendictionalPoint函数是如何工作的,因为我在这篇文章中将GetClosestPoint修改为函数,它可以工作,但我并不完全理解。
 
 
  1. (vl-load-com)
  2. ;;v2016-05-13
  3. ;;ziele_o2k
  4. ;;Main function
  5. (defun c:teee ( / EntPline BlocksSS DistForFilterSS BlkEntLst)
  6. (if
  7.         (and
  8.                 (setq
  9.                         EntPline (car (entsel "\nSelect Main Pline > "));select main pline
  10.                         BlocksSS (ssget '((0 . "INSERT") (2 . "BLOCK") (66 . 1)));ssget blocks
  11.                         DistForFilterSS (getreal "\nType offset distance to filter blocks > ");get distance for
  12.                 )
  13.                 (member (cdr (assoc 0 (entget EntPline))) '("POLYLINE" "LWPOLYLINE"))
  14.                 (setq BlkEntLst (PZ:FilterSS EntPline BlocksSS DistForFilterSS))
  15.         )
  16.         (print BlkEntLst)
  17.         (print "No blocks")
  18. )
  19. (princ)
  20. )
  21. ;;Function to filter ssget. Returns list of entity names that are perpendicular
  22. ;;to selected center, main pline, else nil
  23. (defun PZ:FilterSS (MainPline BlkSS dist / TmpEnts in BlkPt PerpBlkLst)
  24. (setq
  25.         TmpEnts
  26.         (mapcar
  27.                 'vlax-vla-object->ename
  28.                 (vlax-invoke (vlax-ename->vla-object MainPline) 'Explode)
  29.         )
  30. )
  31. (repeat (setq in (sslength BlkSS))
  32.         (setq BlkPt (cdr (assoc 10 (entget (ssname BlkSS (setq in (1- in)))))))
  33.         (if
  34.                 (and
  35.                         (getPerpendicularPoint TmpEnts BlkPt)
  36.                         (<= (distance (getPerpendicularPoint TmpEnts BlkPt) BlkPt) dist)
  37.                 )
  38.                 (setq PerpBlkLst (cons (ssname BlkSS in) PerpBlkLst))
  39.                 nil
  40.         )
  41. )
  42. (mapcar '(lambda (x) (vla-delete (vlax-ename->vla-object x))) TmpEnts) ; remove the segments
  43. PerpBlkLst
  44. )
  45. ;; modified function from this CAB post
  46. ;;http://www.cadtutor.net/forum/showthread.php?30556-Create-Perpendicular-Line-at-every-intersection-point&p=204357&viewfull=1#post204357
  47. (defun getPerpendicularPoint (Ents pt / ent clspt endpts perpts result dist)
  48. (foreach ent Ents
  49.    (if
  50.                 (or
  51.                         (< (distance (setq clspt (vlax-curve-getclosestpointto ent pt)) (vlax-curve-getstartpoint ent)) 0.0001)
  52.                         (< (distance clspt (vlax-curve-getendpoint ent)) 0.0001)
  53.                 )
  54.                 nil
  55.      (setq perpts (cons clspt perpts)) ; else got a perpendicular point
  56.    )
  57. )
  58. (setq
  59.         perpts
  60.         (mapcar
  61.                 '(lambda(x / tmp)
  62.                         (cond
  63.                                 ((null dist)(setq dist (distance pt x) result x))
  64.                                 ((< (setq tmp (distance pt x)) dist)
  65.                                                                                                                                          (setq dist tmp result x))
  66.                         )
  67.                 )
  68.                 perpts
  69.         )
  70. )
  71. result
  72. )
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:59:56 | 显示全部楼层
谢谢你的代码。它很好,但有一些错误。
我自己写了(基于Tharwat代码:),它对我来说很好。
  1. (defun c:test  (/ ss pl ds d lst l srt _att fnl fl out)
  2. ;; Tharwat - Date: 14.May.2016 ;;
  3. (cond
  4.    ((not (setq ss (ssget "_X"
  5.                          (list '(0 . "INSERT")
  6.                                '(2 . "Block")
  7.                                (cons 410 (getvar 'ctab))))))
  8.     (princ
  9.       "\nCould not find any block named <Block> in this drawing !"))
  10.    ((not (and (princ "\nPick a LWpolyline:")
  11.               (setq pl (ssget "_+.:S:E" '((0 . "LWPOLYLINE"))))
  12.               ))
  13.     (princ "\nMissed. Try again"))
  14.    ((setq
  15.       ds (getdist
  16.            "\nSpecify gap distance between Polyline and blocks :"))
  17.     ((lambda (i / sn pt cl)
  18.        (while (setq sn (ssname ss (setq i (1+ i))))
  19.          (setq pt (trans (cdr (assoc 10 (entget sn))) 1 0)
  20.                cl (vlax-curve-getclosestpointto (ssname pl 0) pt)
  21.                )
  22.          (if (<= (distance pt cl) ds)
  23.            (setq lst (cons (list sn pt cl) lst))
  24.            )
  25.          )
  26.        )
  27.       -1)
  28.     (if lst
  29.       (progn
  30.         (mapcar '(lambda (x)
  31.                    (setq
  32.                      l (cons (list (vlax-curve-getdistatpoint
  33.                                      (ssname pl 0)
  34.                                      (caddr x))
  35.                                    (car x))
  36.                              l)))
  37.                 lst
  38.                 )
  39.         (setq srt (vl-sort l '(lambda (j k) (< (car j) (car k)))))
  40.         (defun _att  (e)
  41.           (read (vla-get-textstring
  42.                   (car (vlax-invoke
  43.                          (vlax-ename->vla-object e)
  44.                          'getattributes))))
  45.           )
  46.         (mapcar '(lambda (x)
  47.                    (if d
  48.                      (setq fnl (cons (list (_att (cadr x)) (- (car x) d))
  49.                                      fnl)
  50.                            d   (car x)
  51.                            )
  52.                      (setq d   (car x)
  53.                            fnl (cons (list (_att (cadr x)) d) fnl)
  54.                            )
  55.                      ))
  56.                 srt)
  57.         (setq fl  (list "last" (cadar fnl))
  58.               out (cons fl (cdr fnl))
  59.               )
  60.         )
  61.       )))
  62. (if out
  63.    (reverse out)
  64.    (princ))
  65. )(vl-load-com)

欢迎对我的代码发表评论!
183913o7d8rp8j21w77p3x.jpg
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:05:36 | 显示全部楼层
首先,你无权从我的密码中删除我的名字。
其次,我的例行程序完全按照您在第一篇帖子中发布的列表执行,并且(您的代码)会打印一个完全不同的列表。
 
所以,你不应该说错误,但你的错误是,你没有很清楚地描述你的需求。
回复

使用道具 举报

46

主题

161

帖子

104

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
242
发表于 2022-7-5 18:10:22 | 显示全部楼层
首先,对不起,先生,把你的名字从代码中删除了。
是的,你的代码有一些我在测试中发现的错误。
1) 首先:
使用附加文件example\u v1尝试您的代码。图纸。lisp返回以下列表(间隙距离等于15):
  1. (vl-load-com)
  2. ;;v2016-05-17
  3. ;;ziele_o2k
  4. ;;Main function
  5. (defun c:te2 ( / ss pl ds lst1 sl lst2 lst3 srt out)
  6. (cond
  7.    (
  8.      (not (setq ss (ssget "_X" (list '(0 . "INSERT") '(2 . "Block") (cons 410 (getvar 'ctab))))))
  9.      (princ "\nCould not find any block named <Block> in this drawing !")
  10.    );selecting all blocks in drawing
  11.    (
  12.      (not (and (princ "\nPick a LWpolyline:")(setq pl (ssget "_+.:S:E" '((0 . "LWPOLYLINE"))))))
  13.      (princ "\nMissed. Try again")
  14.    );get main pline
  15.    (
  16.      (setq ds (getdist "\nSpecify gap distance between Polyline and blocks :"));set distance to filter blocks
  17.      (
  18.        (lambda (i / sn pt cl)
  19.          (while (setq sn (ssname ss (setq i (1+ i))))
  20.            (setq
  21.              pt (trans (cdr (assoc 10 (entget sn))) 1 0);pt block base point in WCS
  22.              cl (vlax-curve-getclosestpointto (ssname pl 0) pt);coordinates of point on curve (in WCS) which is nearest to curve
  23.            )
  24.            (if
  25.              (<= (distance pt cl) ds);filter blocks from ss which are in smaller or eqal distance to given distace
  26.              (setq lst1 (cons (list sn pt cl) lst1));make list with ename of block, base point of block and point on curve
  27.            )
  28.          )
  29.        )
  30.       -1
  31.      )
  32.      (if lst1
  33.        (progn
  34.          (setq sl (PZ:getPolySegs (ssname pl 0)))
  35.          (foreach %1 lst1
  36.            (
  37.              (lambda (%2 / )
  38.                (cond
  39.                  (
  40.                    (= (vlax-curve-getParamAtPoint (ssname pl 0) (caddr %2))(vlax-curve-getStartParam(ssname pl 0)))
  41.                    (if
  42.                      (PZ:IsPerpendicular
  43.                        (vlax-curve-getPointAtParam (ssname pl 0) (vlax-curve-getStartParam(ssname pl 0)))
  44.                        (vlax-curve-getPointAtParam (ssname pl 0) (1+ (vlax-curve-getStartParam(ssname pl 0))))
  45.                        (cadr %2)
  46.                        (caddr %2)
  47.                        (cadar sl)
  48.                      )
  49.                      (setq lst2 (cons %2 lst2))
  50.                    )
  51.                  )
  52.                  (
  53.                    (= (vlax-curve-getParamAtPoint (ssname pl 0) (caddr %2))(vlax-curve-getEndParam(ssname pl 0)))
  54.                    (if
  55.                      (PZ:IsPerpendicular
  56.                        (vlax-curve-getPointAtParam (ssname pl 0) (vlax-curve-getEndParam(ssname pl 0)))
  57.                        (vlax-curve-getPointAtParam (ssname pl 0) (1- (vlax-curve-getEndParam(ssname pl 0))))
  58.                        (cadr %2)
  59.                        (caddr %2)
  60.                        (cadr (last sl))
  61.                      )
  62.                      (setq lst2 (cons %2 lst2))
  63.                    )
  64.                  )
  65.                  (T (setq lst2 (cons %2 lst2)))
  66.                )
  67.              )
  68.              %1
  69.            )
  70.          )
  71.          (if lst2
  72.            (progn
  73.              (mapcar
  74.                '(lambda (%1)
  75.                  (setq lst3 (cons (list (vlax-curve-getdistatpoint(ssname pl 0)(caddr %1))(car %1))lst3))
  76.                )
  77.                lst2
  78.              )
  79.              (setq srt (vl-sort lst3 '(lambda (j k) (< (car j) (car k)))))
  80.              (defun _att (e)
  81.                (read
  82.                  (vla-get-textstring
  83.                    (car (vlax-invoke (vlax-ename->vla-object e) 'getattributes))
  84.                  )
  85.                )
  86.              )
  87.              (mapcar
  88.                '(lambda (%)
  89.                  (setq
  90.                    out
  91.                    (cons
  92.                      (list  
  93.                        (_att (cadr %)) (car %) (- (PZ:GetCurveLength (ssname pl 0)) (car %))
  94.                      )
  95.                      out
  96.                    )
  97.                  )
  98.                )
  99.                srt
  100.              )
  101.            )
  102.          )
  103.        )
  104.      )
  105.      
  106.    )
  107. )
  108. (if out
  109.         (setq out (reverse out))
  110.         (princ)
  111. )
  112. (terpri)
  113. (princ out)
  114. (princ)
  115. )
  116. ;http://www.cadtutor.net/forum/archive/index.php/t-60816.html?
  117. (defun LM:Roundto ( n p / f )
  118. (setq n (- n (setq f (rem n (setq p (expt 10. (- p)))))))
  119. (if (< 0.5 (/ (abs f) p))
  120. ((if (minusp n) - +) n p)
  121. n
  122. )
  123. )
  124. ;modified from
  125. ;https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/get-polyline-length/td-p/817505
  126. (defun PZ:GetCurveLength (curve / )
  127. (vl-load-com)
  128. (vlax-curve-getDistAtParam curve
  129.    (vlax-curve-getEndParam curve)
  130. )
  131. )
  132. ;verify if segment is perpendicular to pline segment
  133. ;segment is given by p3 and p4
  134. ;pline segment is given by p1 p2 and b
  135. ;if b is not equal 0 then given segment is arc
  136. (defun PZ:IsPerpendicular (p1 p2 p3 p4 b / xu xv yu yv )
  137. (if (not (eq b 0))
  138.         (setq
  139.                 p1 p4
  140.                 p2 (LM:bulgecentre p1 p2 b)
  141.         )
  142. )
  143. (foreach n (list p1 p2 p3 p4) (print n))
  144. (setq
  145.    xu (- (car p2) (car p1))
  146.    yu (- (cadr p2) (cadr p1))
  147.    xv (- (car p4) (car p3))
  148.    yv (- (cadr p4) (cadr p3))
  149. )
  150. (if (eq b 0)
  151.    (cond
  152.      ((eq(LM:Roundto(+ (* xu xv) (* yu yv))6)0) (print "perp")T)
  153.      (T  (print "notperp") nil)
  154.    );condition for perpendicular
  155.    (cond
  156.      ((eq(LM:Roundto(- (* xu yv) (* xv yu))6)0)(print "parall")T)
  157.      (T (print "notparall")nil)
  158.    );condition for parallel
  159. )
  160. )
  161. ;modified lisp from
  162. ;http://www.lee-mac.com/lisp/html/PolyInfoV1-3.html
  163. ;; Bulge Centre  -  Lee Mac
  164. ;; p1 - start vertex
  165. ;; p2 - end vertex
  166. ;; b  - bulge
  167. ;; Returns the centre of the arc described by the given bulge and vertices
  168. (defun LM:bulgecentre ( p1 p2 b )
  169. (polar p1
  170.    (+ (angle p1 p2) (- (/ pi 2) (* 2 (atan b))))
  171.    (/ (* (distance p1 p2) (1+ (* b b))) 4 b)
  172. )
  173. )
  174. ;modified lisp from
  175. ;http://www.afralisp.net/autolisp/tutorials/polyline-bulges-part-1.php
  176. (defun PZ:getPolySegs (ent / entl p1 pt bulge seg ptlst)
  177. (cond (ent
  178.                         (setq entl (entget ent))
  179.         ;; save start point if polyline is closed
  180.         (if (= (logand (cdr (assoc 70 entl)) 1) 1)
  181.           (setq p1 (cdr (assoc 10 entl)))
  182.         )
  183.         ;; run thru entity list to collect list of segments
  184.         (while (setq entl (member (assoc 10 entl) entl))
  185.           ;; if segment then add to list
  186.           (if (and pt bulge)
  187.             (setq seg (list pt bulge))
  188.           )
  189.           ;; save next point and bulge
  190.           (setq pt    (cdr (assoc 10 entl))
  191.                 bulge (cdr (assoc 42 entl))
  192.           )
  193.           ;; if segment is build then add last point to segment
  194.           ;; and add segment to list
  195.           (if seg
  196.             (setq seg (append seg (list pt))
  197.                   ptlst (cons seg ptlst))
  198.           )
  199.           ;; reduce list and clear temporary segment
  200.           (setq entl  (cdr entl)
  201.                 seg   nil
  202.           )
  203.         )
  204.        )
  205. )
  206. ;; if polyline is closed then add closing segment to list
  207. (if p1 (setq ptlst (cons (list pt bulge p1) ptlst)))
  208. ;; reverse and return list of segments
  209. (reverse ptlst)
  210. )

我不想要第一个元素:(99 0.0)。这个错误在我的第一篇文章中没有明确指出,但我不想浪费你的时间,所以我在修改中修复了它。
2) 第二:
使用文件example\u v2尝试lisp。如果这不是错误,那么我不知道是什么。
你们写的lisp很好,有一些小错误,和我在第一篇文章中问的差不多。当我在包装我的修改时,我改变了这个函数的概念,所以这是我的错,我在发布修改时没有提到这一点。
但受够了,你的代码Tharwat非常有用,如果没有它,我将有很大的问题来实现我的目标
BTW最终代码:
  1. ((99 0.0) (1 17.7656) (2 36.4474) (3 26.4085) (5 59.6297) (7 62.222) (8 24.0023) (10 64.0678) (11 21.0495) (12 39.9307) ("last" 35.9001)) ((99 0.0) (1 17.7656) (2 36.4474) (3 26.4085) (5 59.6297) (7 62.222) (8 24.0023) (10 64.0678) (11 21.0495) (12 39.9307) ("last" 35.9001))

 
----
编辑17.05.2016-最终代码中更改的pt变量定义
例1。图纸
示例2。图纸
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:20:29 | 显示全部楼层
没关系,谢谢你为公众澄清这个问题。
回复

使用道具 举报

46

主题

161

帖子

104

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
242
发表于 2022-7-5 18:21:51 | 显示全部楼层
你好
 
我刚刚又看了一遍代码,我认为如果我从你随附的两张图纸中正确地理解了你的观点,你不需要做更多的修改。
试试看,让我知道:
 
[code](定义c:测试(/ss pl ds d lst l srt _att fnl out);;塔尔瓦特-日期:22。也许2016 ;; (cond((not(setq ss(ssget“_X”(list’(0。“INSERT”)'(2。“Block”)(cons 410(getvar“ctab))))))(princ“\n无法找到此图形中命名的任何块!”)((not(and(princ“\n点击一条LWpolyline:”)(setq pl(ssget“+:S:E”((0。“LWpolyline”))))(princ“\n missed.Try again”)((setq ds(getdist”\n指定多段线和块之间的间隙距离:)((lambda(i/sn pt cl)(while(setq sn(ssname ss(setq i(1+i))))))(setq pt(cdr(assoc 10(entget sn)))cl(vlax曲线getclosestpointto(ssname pl 0)pt))(如果(
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:29:30 | 显示全部楼层
你有机会尝试我上面发布的最后代码吗?
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:33:28 | 显示全部楼层
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 03:32 , Processed in 0.479413 second(s), 74 queries .

© 2020-2025 乐筑天下

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