乐筑天下

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

[编程交流] 定位到属性

[复制链接]

27

主题

126

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2022-7-6 09:33:42 | 显示全部楼层 |阅读模式
下面是我的代码,虽然工作不正常。
 
它的作用:
基于选择多段线,然后插入块来确定桩号,并将其存储在statxt变量中。它还可以在后面的两个点上加一个小数,例如1+68.85。
 
我想做的是。。。
选择多段线,选择一个块,然后将其填充到STA的属性标记上,该点上没有小数点。理想情况下,我希望能够通过选择一组块来实现这一点,并根据每个块的位置同时填充这些值。
 
  1. (defun c:sdi ()(j))
  2. (defun j (/ uicon ent ename sta
  3.      ang ang-test stra dotpos statxt)
  4. (vl-load-com)
  5. (setvar "cmdecho" 0)
  6. (EXTEK_StartErrorTrap)
  7.      (setq blocks (mapcar (function strcase)
  8.        '("anchor-sta"
  9.        "catch basin-sta"
  10.        "conc. pole-sta"
  11.        "elec transformer-sta"
  12.        "fiber marker tube-sta"
  13.        "fire hydrant-sta"
  14.        "grate inlet-sta"
  15.        "handhole-sta"
  16.        "handhole prop-sta"
  17.        "mailbox-sta"
  18.        "manhole-sta"
  19.        "parking meter-sta"
  20.        "pole-sta"
  21.        "property pin-sta"
  22.        "sign-sta"
  23.        "steel pole-sta"
  24.        "steel post-sta"
  25.        "street light-sta"
  26.        "tel ped-sta"
  27.        "test pit-sta"
  28.        "traffic control box-sta"
  29.        "traffic pole-sta"
  30.        "traffic signal-sta"
  31.        "tree-sta"
  32.        "verizon mh-sta"
  33.        "valve-sta"
  34.        "water meter-sta")) i -1)
  35. (setq uicon (getvar "ucsicon" ))
  36. (setvar "osmode" 44)
  37. ;(vl-cmdf "UCS" "w")
  38. (setq ent (entsel "\nSelect Running Line: ")
  39.    ename (car ent))
  40. ;;;====Check if entsel is valid====
  41. (if (not ent)
  42.    (progn
  43.      (princ "\nMissed... try again!")
  44.      (j)
  45.      )
  46.    )
  47. ;;;====End check===================
  48.   (setq sta (vlax-curve-getDistAtPoint ename
  49.    (setq on-pt (vlax-curve-getClosestPointTo ename
  50.    (setq ox-pt (trans (getpoint "\nSelect Block Intersection" ) 1 0))))))
  51. (setq stra (rtos sta 2 2))
  52. (if (not (= stra "0.00"))
  53.    (progn
  54.      (setq dotpos (1+ (vl-string-search stra)))
  55.       (substr stra (- dotpos 2))
  56.        (if (>= (strlen stra) 6)
  57.         (setq statxt (strcat (substr stra 1 (- dotpos 3)) "+"(substr stra (- dotpos 2))))
  58.           (setq statxt (strcat (chr 48)"+" (substr stra (- dotpos 2))))
  59.        )
  60.      );progn
  61.    (setq statxt "0+00")
  62.    )
  63.   (if
  64.     (and
  65.      (setq s1
  66.        (ssget ":L"
  67.          (list '(0 . "INSERT")
  68.            (cons 2
  69.              (apply 'strcat (cons "`*U*" (mapcar '(lambda ( s ) (strcat "," s)) blocks)))
  70.            )                                                     ; End Cons
  71.          )                                                    ; End list
  72.        )                                                    ; End ssget
  73.      )
  74.    )                                                        ; End setq
  75.    (while (setq e (ssname s1 (setq i (1+ i))))
  76.      (if
  77.        (and
  78.          (vl-position
  79.            (strcase
  80.              (vlax-get-property (setq o (vlax-ename->vla-object e))
  81.                (if (vlax-property-available-p o 'EffectiveName) 'EffectiveName 'Name)
  82.              )
  83.            )
  84.            blocks
  85.          )
  86.          (eq (vla-get-isDynamicBlock o) :vlax-true)
  87.        )
  88.        (LM:SetDynamicPropValue o "STA" statxt)
  89.      )
  90.    )
  91. )                                                        ; End
  92. (EXTEK_EndErrorTrap)
  93. (setvar "cmdecho" 1)
  94. (princ (strcat "\n Stationing:" statxt ""))
  95. (princ)
  96. )
  97. ;;------------=={ Set Dynamic Property Value }==--------------;;
  98. ;;                                                            ;;
  99. ;;  Modifies the value of a Dynamic Block Property            ;;
  100. ;;------------------------------------------------------------;;
  101. ;;  Author: Lee Mac, Copyright © 2010 - www.lee-mac.com       ;;
  102. ;;------------------------------------------------------------;;
  103. ;;  Arguments:                                                ;;
  104. ;;  block - VLA Dynamic Block Reference Object                ;;
  105. ;;  prop  - Dynamic Block Property Name                       ;;
  106. ;;  value - New value for Property                            ;;
  107. ;;------------------------------------------------------------;;
  108. ;;  Returns: Value property was set to, else nil              ;;
  109. ;;------------------------------------------------------------;;
  110. (defun LM:SetDynamicPropValue ( block prop value )
  111. (vl-some
  112.    (function
  113.      (lambda ( _prop )
  114.        (if (eq prop (vla-get-propertyname _prop))
  115.          (progn
  116.            (vla-put-value _prop
  117.              (vlax-make-variant value
  118.                (vlax-variant-type (vla-get-value _prop))
  119.              )
  120.            )
  121.            value
  122.          )
  123.        )
  124.      )
  125.    )
  126.    (vlax-invoke block 'GetDynamicBlockProperties)
  127. )
  128. )
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

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

铜币
438
发表于 2022-7-6 09:37:54 | 显示全部楼层
您应该真正删除代码的开头部分,该部分逐步完成并将每个字符串大写,然后用大写字母键入。我在最初的示例中这样做的原因是因为它是一个子例程,我不能保证用户会向它提供一个全大写字符串。
回复

使用道具 举报

27

主题

126

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2022-7-6 09:41:41 | 显示全部楼层
这是一个更新,我认为编码更有条理。因为我在其他几个LISP中使用了这个块列表,所以我只是为它创建了一个单独的defun,根据需要调用它们。
 
这将获取值,显示它,并允许用户选择块,但由于某种原因不会填充值。尽管如此,我仍然希望能够在这里选择运行线,在开始时选择一组块,然后填充定位值,向上或向下取整,不带任何小数。
 
尽管如此,我仍然希望通过不必选择最终实现这一点
 
  1. (defun c:sdi ()(j))
  2. (defun j (/ temperror *error* varlst oldvar uicon ent ename sta on-pt ox-pt ox-di
  3.      ang ang-test stra dotpos statxt tot)
  4. (vl-load-com)
  5. (setvar "cmdecho" 0)
  6. (EXTEK_StartErrorTrap)
  7. (setq uicon (getvar "ucsicon" ))
  8. (setvar "osmode" 44)
  9. (setq ent (entsel "\nSelect Running Line: ")
  10.    ename (car ent))
  11. (if (not ent)
  12.    (progn
  13.      (princ "\n`Missed... try again!")
  14.      (j)
  15.      )
  16.    )
  17.   (setq sta (vlax-curve-getDistAtPoint ename
  18.    (setq on-pt (vlax-curve-getClosestPointTo ename
  19.    (setq ox-pt (trans (getpoint "\nSelect Block Intersection" ) 1 0))))))
  20. (setq stra (rtos sta 2 2))
  21. (setq sta (rtos sta))
  22. (if (not (= stra "0.00"))
  23.    (progn
  24.      (setq dotpos (1+ (vl-string-search "." stra)))
  25.       (substr stra (- dotpos 2))
  26.        (if (>= (strlen stra) 6)
  27.         (setq statxt (strcat (substr stra 1 (- dotpos 3)) "+"(substr stra (- dotpos 2))))
  28.           (setq statxt (strcat (chr 48)"+" (substr stra (- dotpos 0))))
  29.        )
  30.      )
  31.    (setq statxt "0+00")
  32.    )
  33. (EXTEK_EndErrorTrap)
  34. (setvar "cmdecho" 1)
  35. (princ (strcat "\n Stationing:" statxt ""))
  36. (princ (strcat "\n Stationing:" sta ""))
  37. (stationvalue)
  38. (princ)
  39. )
  40. (defun stationvalue ()
  41. (EXTEK_StationBlocks)  
  42. (if
  43.      (setq s1
  44.        (ssget ":L"
  45.          (list '(0 . "INSERT")
  46.            (cons 2
  47.              (apply 'strcat (cons "`*U*" (mapcar '(lambda ( s ) (strcat "," s)) blocks)))
  48.            )                                                     ; End Cons
  49.          )                                                    ; End list
  50.        )                                                    ; End ssget
  51.      )                                                        ; End setq
  52.    (while (setq e (ssname s1 (setq i (1+ i))))
  53.      (if
  54.        (and
  55.          (vl-position
  56.            (strcase
  57.              (vlax-get-property (setq o (vlax-ename->vla-object e))
  58.                (if (vlax-property-available-p o 'EffectiveName) 'EffectiveName 'Name)
  59.              )
  60.            )
  61.            blocks
  62.          )
  63.          (eq (vla-get-isDynamicBlock o) :vlax-true)
  64.        )
  65.        (LM:SetDynamicPropValue o "STA" statxt)
  66.      )
  67.    )
  68. ))
  69. ;;------------=={ Set Dynamic Property Value }==--------------;;
  70. ;;                                                            ;;
  71. ;;  Modifies the value of a Dynamic Block Property            ;;
  72. ;;------------------------------------------------------------;;
  73. ;;  Author: Lee Mac, Copyright © 2010 - www.lee-mac.com       ;;
  74. ;;------------------------------------------------------------;;
  75. ;;  Arguments:                                                ;;
  76. ;;  block - VLA Dynamic Block Reference Object                ;;
  77. ;;  prop  - Dynamic Block Property Name                       ;;
  78. ;;  value - New value for Property                            ;;
  79. ;;------------------------------------------------------------;;
  80. ;;  Returns: Value property was set to, else nil              ;;
  81. ;;------------------------------------------------------------;;
  82. (defun LM:SetDynamicPropValue ( blocks prop value )
  83. (vl-some
  84.    (function
  85.      (lambda ( _prop )
  86.        (if (eq prop (vla-get-propertyname _prop))
  87.          (progn
  88.            (vla-put-value _prop
  89.              (vlax-make-variant value
  90.                (vlax-variant-type (vla-get-value _prop))
  91.              )
  92.            )
  93.            value
  94.          )
  95.        )
  96.      )
  97.    )
  98.    (vlax-invoke blocks 'GetDynamicBlockProperties)
  99. )
  100. )
回复

使用道具 举报

6

主题

249

帖子

247

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-6 09:45:37 | 显示全部楼层
ohnoto,你能发布一个典型的块吗,然后也许我们可以找到错误
史蒂夫
回复

使用道具 举报

27

主题

126

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2022-7-6 09:48:12 | 显示全部楼层
附件如下。。。谢谢
人孔sta。图纸
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:52:42 | 显示全部楼层
嗨,Ohnoto,
 
我可以看出,在过去的几行文章中,你已经为此操劳了一段时间,所以我想看看是否可以帮上忙。
 
我没有测试过以下代码,因为我从未做过任何“定位”,所以代码大多是猜测。
 
  1. (defun c:test ( / blocks i l o s ss ) (vl-load-com)
  2. (setq blocks
  3.   '(
  4.      "ANCHOR-STA"
  5.      "CATCH BASIN-STA"
  6.      "CONC. POLE-STA"
  7.      "ELEC TRANSFORMER-STA"
  8.      "FIBER MARKER TUBE-STA"
  9.      "FIRE HYDRANT-STA"
  10.      "GRATE INLET-STA"
  11.      "HANDHOLE-STA"
  12.      "HANDHOLE PROP-STA"
  13.      "MAILBOX-STA"
  14.      "MANHOLE-STA"
  15.      "PARKING METER-STA"
  16.      "POLE-STA"
  17.      "PROPERTY PIN-STA"
  18.      "SIGN-STA"
  19.      "STEEL POLE-STA"
  20.      "STEEL POST-STA"
  21.      "STREET LIGHT-STA"
  22.      "TEL PED-STA"
  23.      "TEST PIT-STA"
  24.      "TRAFFIC CONTROL BOX-STA"
  25.      "TRAFFIC POLE-STA"
  26.      "TRAFFIC SIGNAL-STA"
  27.      "TREE-STA"
  28.      "VERIZON MH-STA"
  29.      "VALVE-STA"
  30.      "WATER METER-STA"
  31.    )
  32. )
  33. (if
  34.    (and
  35.      (setq l
  36.        (LM:Select "\nSelect Running Line: "
  37.         '(lambda ( x )
  38.            (not
  39.              (vl-catch-all-error-p
  40.                (vl-catch-all-apply 'vlax-curve-getendparam (list x))
  41.              )
  42.            )
  43.          )
  44.          entsel
  45.        )
  46.      )
  47.      (princ "\nSelect Dynamic Blocks: ")
  48.      (setq ss
  49.        (ssget "_:L"
  50.          (list '(0 . "INSERT")
  51.            (cons 2
  52.              (apply 'strcat (cons "`*U*" (mapcar '(lambda ( s ) (strcat "," s)) blocks)))
  53.            )
  54.          )
  55.        )
  56.      )
  57.    )
  58.    (repeat (setq i (sslength ss))
  59.      (if
  60.        (and
  61.          (member
  62.            (strcase
  63.              (vlax-get-property (setq o (vlax-ename->vla-object (ssname ss (setq i (1- i)))))
  64.                (if (vlax-property-available-p o 'EffectiveName) 'EffectiveName 'Name)
  65.              )
  66.            )
  67.            blocks
  68.          )
  69.          (eq (vla-get-isDynamicBlock o) :vlax-true)
  70.          (setq s
  71.            (vlax-curve-getdistatpoint l
  72.              (vlax-curve-getclosestpointto l (vlax-get o 'insertionpoint))
  73.            )
  74.          )
  75.        )
  76.        (LM:SetDynamicPropValue o "STA" (vl-string-subst "+" "." (rtos s 2 2)))
  77.      )
  78.    )
  79. )
  80. (princ)
  81. )
  82. ;;------------=={ Set Dynamic Property Value }==--------------;;
  83. ;;                                                            ;;
  84. ;;  Modifies the value of a Dynamic Block Property            ;;
  85. ;;------------------------------------------------------------;;
  86. ;;  Author: Lee Mac, Copyright © 2010 - www.lee-mac.com       ;;
  87. ;;------------------------------------------------------------;;
  88. ;;  Arguments:                                                ;;
  89. ;;  block - VLA Dynamic Block Reference Object                ;;
  90. ;;  prop  - Dynamic Block Property Name                       ;;
  91. ;;  value - New value for Property                            ;;
  92. ;;------------------------------------------------------------;;
  93. ;;  Returns: Value property was set to, else nil              ;;
  94. ;;------------------------------------------------------------;;
  95. (defun LM:SetDynamicPropValue ( block prop value ) (setq prop (strcase prop))
  96. (vl-some
  97.    (function
  98.      (lambda ( _prop )
  99.        (if (eq prop (strcase (vla-get-propertyname _prop)))
  100.          (progn
  101.            (vla-put-value _prop
  102.              (vlax-make-variant value
  103.                (vlax-variant-type (vla-get-value _prop))
  104.              )
  105.            )
  106.            value
  107.          )
  108.        )
  109.      )
  110.    )
  111.    (vlax-invoke block 'GetDynamicBlockProperties)
  112. )
  113. )
  114. ;;---------------------=={ Select if }==----------------------;;
  115. ;;                                                            ;;
  116. ;;  Continuous selection prompts until a predicate function   ;;
  117. ;;  is validated                                              ;;
  118. ;;------------------------------------------------------------;;
  119. ;;  Author: Lee Mac, Copyright © 2011 - www.lee-mac.com       ;;
  120. ;;------------------------------------------------------------;;
  121. ;;  Arguments:                                                ;;
  122. ;;  msg  - prompt string                                      ;;
  123. ;;  pred - optional predicate function taking ename argument  ;;
  124. ;;  func - selection function to invoke                       ;;
  125. ;;------------------------------------------------------------;;
  126. ;;  Returns:  selected entity ename if successful, else nil   ;;
  127. ;;------------------------------------------------------------;;
  128. (defun LM:Select ( msg pred func / e ) (setq pred (eval pred))  
  129. (while
  130.    (progn (setvar 'ERRNO 0) (setq e (car (func msg)))
  131.      (cond
  132.        ( (= 7 (getvar 'ERRNO))
  133.          (princ "\n** Missed, Try again **")
  134.        )
  135.        ( (eq 'ENAME (type e))
  136.          (if (and pred (not (pred e)))
  137.            (princ "\n** Invalid Object Selected **")
  138.          )
  139.        )
  140.      )
  141.    )
  142. )
  143. e
  144. )
HTH
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:54:12 | 显示全部楼层
顺便说一句,如果动态块都以“-STA”结尾,您可以将ssget过滤器大大简化为:
 
  1. (ssget "_:L" '((0 . "INSERT") (2 . "`*U*,*-STA")))
回复

使用道具 举报

27

主题

126

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2022-7-6 09:57:18 | 显示全部楼层
谢谢李,它更接近我想要的。我看到你们在试图确定站点时对代码做了什么。然而,STA值中没有任何值。
 
为了查看返回了什么值,我在命令行中打印了“L”,并得到“错误:错误的参数类型:stringp”。
 
编辑:谢谢你的提示^
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:00:46 | 显示全部楼层
 
可能是属性名的大小写敏感度问题-我已经调整了我的子函数,请重试上述代码。
 
 
“l”是所选行的entityname,而不是值-“s”是值。
回复

使用道具 举报

27

主题

126

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2022-7-6 10:05:01 | 显示全部楼层
哎呀。。。正在读取该变量。好的,类似错误:
 
; 错误:错误的参数类型:stringp 77.5725
 
在我的测试77.5725中,这是从线路开始的正确长度。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 02:25 , Processed in 0.542211 second(s), 72 queries .

© 2020-2025 乐筑天下

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