乐筑天下

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

[编程交流] 沿放置属性块

[复制链接]

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 17:53:14 | 显示全部楼层
这真让人筋疲力尽
 
试试看,让我知道。
 
  1. (defun c:Test (/ *error* blk bk atts sp s e l d v km m lng)
  2. ;; Tharwat 11.Aug.2016 ;;
  3. (defun *error* (msg)
  4.    (if atts
  5.      (mapcar 'setvar '(ATTREQ ATTDIA) atts)
  6.    )
  7.    (and msg
  8.         (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*EXIT*"))
  9.         (princ (strcat "\nError => " msg))
  10.    )
  11.    (princ)
  12. )
  13. (setq blk "BLOCO SINALEIRO")
  14. ;; Block name
  15. (if (and (tblsearch "BLOCK" blk)
  16.           (princ "\nSelect LWpolyline :")
  17.           (setq s (ssget "_+.:S:E" '((0 . "LWPOLYLINE"))))
  18.           (setq l (vlax-curve-getdistatpoint
  19.                     (setq e (ssname s 0))
  20.                     (vlax-curve-getendpoint e)
  21.                   )
  22.           )
  23.      )
  24.    (progn
  25.      (setq atts (mapcar 'getvar '(ATTREQ ATTDIA))
  26.            sp   (vlax-get (vla-get-activelayout
  27.                             (vla-get-activedocument (vlax-get-acad-object))
  28.                           )
  29.                           'Block
  30.                 )
  31.            km   (if (= (setq lng (length (vl-string->list (rtos l 2 0)))) 3)
  32.                   "000"
  33.                   (strcat (nth (- lng 3) '("" "00" "0"))
  34.                           (substr (rtos l 2 0) 1 (- lng 3))
  35.                   )
  36.                 )
  37.            m    (if (= lng 3)
  38.                   (substr (rtos l 2 2) 1 3)
  39.                   (substr (rtos l 2 2) (1+ (- lng 3)) 3)
  40.                 )
  41.      )
  42.      (mapcar 'setvar '(ATTREQ ATTDIA) '(1 0))
  43.      (while
  44.        (and (setq d (getdist (strcat "\nSpecify distance less than "
  45.                                      (rtos l 2 2)
  46.                                      " > :"
  47.                              )
  48.                     )
  49.             )
  50.             (< d l)
  51.             (/= "" (setq v (getstring t "\nSpecify Attribute Value :")))
  52.             (setq bk (vla-insertblock
  53.                        sp
  54.                        (vlax-3d-point (vlax-curve-getpointatdist e d))
  55.                        blk
  56.                        1.0
  57.                        1.0
  58.                        1.0
  59.                        (+ (* pi 0.5)
  60.                           (angle '(0. 0. 0.)
  61.                                  (vlax-curve-getfirstderiv
  62.                                    e
  63.                                    (vlax-curve-getparamatpoint
  64.                                      e
  65.                                      (vlax-curve-getpointatdist e d)
  66.                                    )
  67.                                  )
  68.                           )
  69.                        )
  70.                      )
  71.             )
  72.        )
  73.         (mapcar
  74.           '(lambda (a)
  75.              (vla-put-textstring
  76.                a
  77.                (nth (vl-position (vla-get-tagstring a) '("ID" "KM" "M"))
  78.                     (list v km m)
  79.                )
  80.              )
  81.            )
  82.           (vlax-invoke bk 'getattributes)
  83.         )
  84.      )
  85.    )
  86. )
  87. (if (> d l)
  88.    (alert "\nLong distance entered !")
  89. )
  90. (*error* nil)
  91. (princ)
  92. )(vl-load-com)
回复

使用道具 举报

2

主题

14

帖子

12

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 17:57:14 | 显示全部楼层
我是激进的塔瓦先生!
 
但我想当我试图解释自己的时候,我把变量“l”错当成了变量“d”。。。因为变量“d”是距离中的插入点,因此是信息“km XXX+YYY”的来源。。。我试图纠正这一点,但我没有太多的运气。。。对不起,你觉得呢?
回复

使用道具 举报

2

主题

14

帖子

12

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 18:00:08 | 显示全部楼层
我想如果我把SETQ d放在起点上,它会起作用,然后我把球传给SETQ km,m等等。。。你能告诉我我走对了吗?
 
谢谢
 
  1. (PROGN (SETQ d    (GETDIST
  2.                 (STRCAT "\nSpecify distance less than " (RTOS l 2 2) " > :")
  3.               )
  4.          atts (MAPCAR 'GETVAR '(attreq attdia))
  5.          sp   (VLAX-GET        (VLA-GET-ACTIVELAYOUT
  6.                           (VLA-GET-ACTIVEDOCUMENT (VLAX-GET-ACAD-OBJECT))
  7.                         )
  8.                         'block
  9.               )
  10.          km   (IF (= (SETQ lng (LENGTH (VL-STRING->LIST (RTOS d 2 0)))) 3)
  11.                 "000"
  12.                 (IF (< lng 3 (STRCAT (NTH (- 3 lng) '("" "00" "0"))
  13.                                (SUBSTR (RTOS d 2 0) 1 (- lng 3))
  14.                        )
  15.                     )
  16.                 )
  17.               )
  18.          m    (IF (= lng 3)
  19.                 (SUBSTR (RTOS d 2 2) 1 3)
  20.                 (SUBSTR (RTOS d 2 2) (1+ (- lng 3)) 3)
  21.               )
  22.    )
  23.    )
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 18:02:10 | 显示全部楼层
嗨,塞扎,
 
没关系,别担心,我会修改代码以满足您的需要,不管您有什么错误。
因此,请将您的需求与我在第11篇文章中发布的最后一个程序进行清楚的比较。
回复

使用道具 举报

2

主题

14

帖子

12

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 18:07:25 | 显示全部楼层
嗨,塔瓦,
 
与前一个版本相比,我想通过变量“d”打开变量“l”
 
  1. km   (if (= (setq lng (length (vl-string->list (rtos l 2 0)))) 3)
  2.                   "000"
  3.                   (strcat (nth (- lng 3) '("" "00" "0"))
  4.                           (substr (rtos l 2 0) 1 (- lng 3))
  5.                   )
  6.                 )
  7.            m    (if (= lng 3)
  8.                   (substr (rtos l 2 2) 1 3)
  9.                   (substr (rtos l 2 2) (1+ (- lng 3)) 3)
  10.                 )  

 
我认为这样,属性将显示块插入点的信息。
 
现在,它显示的是多段线的总长度,而不是块相对于多段线长度的位置。
 
在我的尝试中,我试图做到这一点,首先我把SETQ“d”放在其他函数之前,然后我收到了关于第n个函数的错误消息,所以我试图理解它,我想我在这里交换消息比阅读一个月学到了更多。我走对了吗?
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 18:11:07 | 显示全部楼层
嗨,塞扎,
变量“d”表示距离值,表示实数(十进制数),而不是块位置。
 
给我举一个例子,用你以前做过的绘图,让我一次修改程序。
回复

使用道具 举报

2

主题

14

帖子

12

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 18:11:25 | 显示全部楼层
嗨,塔瓦,
 
我希望这张图片能解释我的意思。
 
182045h8nrgb1ebvv8qgbb.jpg
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 18:16:48 | 显示全部楼层
希望这能像预期的那样起作用,试试看,让我知道;
 
  1. (defun c:Test (/ *error* blk bk atts sp s e l d v km m lng)
  2. ;; Tharwat 11.Aug.2016 ;;
  3. (defun *error* (msg)
  4.    (if atts
  5.      (mapcar 'setvar '(ATTREQ ATTDIA) atts)
  6.    )
  7.    (and msg
  8.         (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*EXIT*"))
  9.         (princ (strcat "\nError => " msg))
  10.    )
  11.    (princ)
  12. )
  13. (setq blk "BLOCO SINALEIRO")
  14. ;; Block name
  15. (if (and (tblsearch "BLOCK" blk)
  16.           (princ "\nSelect LWpolyline :")
  17.           (setq s (ssget "_+.:S:E" '((0 . "LWPOLYLINE"))))
  18.           (setq l (vlax-curve-getdistatpoint
  19.                     (setq e (ssname s 0))
  20.                     (vlax-curve-getendpoint e)
  21.                   )
  22.           )
  23.      )
  24.    (progn
  25.      (setq atts (mapcar 'getvar '(ATTREQ ATTDIA))
  26.            sp   (vlax-get (vla-get-activelayout
  27.                             (vla-get-activedocument (vlax-get-acad-object))
  28.                           )
  29.                           'Block
  30.                 )
  31.      )
  32.      (mapcar 'setvar '(ATTREQ ATTDIA) '(1 0))
  33.      (while
  34.        (and (setq d (getdist (strcat "\nSpecify distance less than "
  35.                                      (rtos l 2 2)
  36.                                      " > :"
  37.                              )
  38.                     )
  39.             )
  40.             (< d l)
  41.             (/= "" (setq v (getstring t "\nSpecify Attribute Value :")))
  42.             (setq km (if
  43.                        (<= (setq lng (length (vl-string->list (rtos l 2 0))))
  44.                            3
  45.                        )
  46.                         "000"
  47.                         (strcat (nth (- lng 3) '("" "00" "0" "" ""))
  48.                                 (substr (rtos l 2 0) 1 (- lng 3))
  49.                         )
  50.                      )
  51.                   m  (if
  52.                        (<= (setq lng (length (vl-string->list (rtos d 2 0))))
  53.                            3
  54.                        )
  55.                         (substr (rtos d 2 2) 1 3)
  56.                         (substr (rtos d 2 2) (1+ (- lng 3)) 3)
  57.                      )
  58.                   bk (vla-insertblock
  59.                        sp
  60.                        (vlax-3d-point (vlax-curve-getpointatdist e d))
  61.                        blk
  62.                        1.0
  63.                        1.0
  64.                        1.0
  65.                        (+ (* pi 0.5)
  66.                           (angle '(0. 0. 0.)
  67.                                  (vlax-curve-getfirstderiv
  68.                                    e
  69.                                    (vlax-curve-getparamatpoint
  70.                                      e
  71.                                      (vlax-curve-getpointatdist e d)
  72.                                    )
  73.                                  )
  74.                           )
  75.                        )
  76.                      )
  77.             )
  78.        )
  79.         (mapcar
  80.           '(lambda (a)
  81.              (vla-put-textstring
  82.                a
  83.                (nth (vl-position (vla-get-tagstring a) '("ID" "KM" "M"))
  84.                     (list v km m)
  85.                )
  86.              )
  87.            )
  88.           (vlax-invoke bk 'getattributes)
  89.         )
  90.      )
  91.    )
  92. )
  93. (if (> d l)
  94.    (alert "\nLong distance entered !")
  95. )
  96. (*error* nil)
  97. (princ)
  98. )(vl-load-com)
回复

使用道具 举报

2

主题

14

帖子

12

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 18:19:46 | 显示全部楼层
嗨,塔瓦,
 
这是可行的,但我发现多段线的长度有一个限制,如果我尝试使用长度超过100公里的多段线,它会冻结程序。
这个问题很容易解决?
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 18:23:06 | 显示全部楼层
对不起,这是你第三次谈论与你在这篇帖子的第一篇帖子中提出的不同的问题。
我对这些不同的输入以及你到底想做什么感到困惑。
 
我在这个帖子上花了太多时间,很抱歉,我无法无休止地继续下去。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 08:55 , Processed in 0.538905 second(s), 73 queries .

© 2020-2025 乐筑天下

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