乐筑天下

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

[编程交流] 到的多段线的面积和句柄

[复制链接]

27

主题

126

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2022-7-6 08:00:45 | 显示全部楼层 |阅读模式
我已经修改了一个LISP程序从线程,面积的折线。
 
我想做的是:
 
-获取单个多段线面积的平方英尺。
-获取多段线的acad句柄。
 
在包含许多不同属性标记的属性块内:
-将平方英尺的值放入“NET\u SQ\u FEET”的标签中
-将acad句柄值放入“acad\U句柄”的标记中
 
目前,从下面的代码中,我得到一个错误“VLA-OBJECT”。代码仅尝试放置平方英尺的值。我甚至不知道从哪里开始获取多段线acad句柄的值。
 
  1. (defun c:test ( / area en nm pt )
  2.    (while
  3.        (progn (setvar 'ERRNO 0) (setq en (car (entsel)))
  4.            (cond
  5.                (   (= 7 (getvar 'ERRNO))
  6.                    (princ "\nMissed, try again.")
  7.                )
  8.                (   (eq 'ENAME (type en))
  9.                    (if (vl-catch-all-error-p
  10.                            (setq area (vl-catch-all-apply 'vlax-curve-getarea (list en)))
  11.                        )
  12.                        (princ "\nInvalid Object.")
  13.                    )
  14.                )
  15.                (   (setq area nil)   )
  16.            )
  17.        )
  18.    )
  19. (setq area (rtos (/ area 144.0) 2 2))
  20. (if (setq block (ssget "_:S"))
  21. (progn
  22. (setq block (ssname block 0))
  23. (LM:vl-SetAttributeValue (vlax-ename->vla-object block) "NET_SQ_FEET" area)
  24. )
  25. )
  26.    (princ)
  27. )
  28. (vl-load-com) (princ)
  29. ;;----------------=={ Set Attribute Value }==-----------------;;
  30. ;;                                                            ;;
  31. ;;  Populates the first attribute matching the tag specified  ;;
  32. ;;  found within the block supplied with the value specified, ;;
  33. ;;  if present.                                               ;;
  34. ;;------------------------------------------------------------;;
  35. ;;  Author: Lee Mac, Copyright © 2010 - www.lee-mac.com       ;;
  36. ;;------------------------------------------------------------;;
  37. ;;  Arguments:                                                ;;
  38. ;;  block - VLA Block Reference Object                        ;;
  39. ;;  tag   - Attribute TagString                               ;;
  40. ;;  value - Value to which the Attribute will be set          ;;
  41. ;;------------------------------------------------------------;;
  42. ;;  Returns:  Value the attribute was set to, else nil        ;;
  43. ;;------------------------------------------------------------;;
  44. (defun LM:vl-SetAttributeValue ( block tag value )
  45.    (setq tag (strcase tag))
  46.    (vl-some
  47.        (function
  48.            (lambda ( attrib )
  49.                (if (eq tag (strcase (vla-get-TagString attrib)))
  50.                    (progn
  51.                        (vla-put-TextString attrib value)
  52.                        value
  53.                    )
  54.                )
  55.            )
  56.        )
  57.        (vlax-invoke block 'GetAttributes)
  58.    )
  59. )
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 08:07:13 | 显示全部楼层
SSGET函数将返回选择集,而不是实体;下面的代码将验证用户是否选择了某个项目,并从选择集中提取第一个(也是唯一一个)项目。此外,似乎Lee的代码需要一个VLA对象。
要列出实体,请检查ENTGET函数:
手柄存储在DXF代码5上。
回复

使用道具 举报

27

主题

126

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2022-7-6 08:09:11 | 显示全部楼层
谢谢我更新了原始代码。我会查一下把手放在哪里。
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 08:11:56 | 显示全部楼层
最好使用过滤器进行选择。
1.这将阻止用户选择闭合多段线,而不是ENTSEL:
  1. (if (setq en (ssget "_:S" '((0 . "LWPOLYLINE") (70 . 1)))[color=red])[/color]
  2. (setq en (ssname en 0))
  3. )
2。对于块:
  1. (setq block (ssget "_:S" '((0 . "INSERT"))))
回复

使用道具 举报

27

主题

126

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2022-7-6 08:16:58 | 显示全部楼层
在输入您提供的第一个代码时,我得到的参数错误太少。你能演示一下应该如何放置吗?
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 08:19:18 | 显示全部楼层
你是对的,我错过了一个偏执-请检查固定的代码。很抱歉给您带来不便。
回复

使用道具 举报

27

主题

126

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2022-7-6 08:21:51 | 显示全部楼层
在选择多段线时,将其放置在ENTSEL所在的位置会出现“错误的参数类型:consp”错误。
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 08:26:15 | 显示全部楼层
你能贴出你是如何修改那个部分的吗?
回复

使用道具 举报

27

主题

126

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2022-7-6 08:29:18 | 显示全部楼层
  1. (defun c:test ( / area en nm pt )
  2.    (while
  3.        (progn (setvar 'ERRNO 0) (setq en (car
  4.                        (if (setq en (ssget "_:S" '((0 . "LWPOLYLINE") (70 . 1))))
  5.                          (setq en (ssname en 0))
  6.                          )))
  7.            (cond
  8.                (   (= 7 (getvar 'ERRNO))
  9.                    (princ "\nMissed, try again.")
  10.                )
  11.                (   (eq 'ENAME (type en))
  12.                    (if (vl-catch-all-error-p
  13.                            (setq area (vl-catch-all-apply 'vlax-curve-getarea (list en)))
  14.                        )
  15.                        (princ "\nInvalid Object.")
  16.                    )
  17.                )
  18.                (   (setq area nil)   )
  19.            )
  20.        )
  21.    )
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 08:31:37 | 显示全部楼层
这是您应该如何更改该部分:
你可以写得很简单:
  1. (defun c:test ( / area en nm pt)
  2. (if (setq en (ssget "_:S" '((0 . "LWPOLYLINE") (70 . 1))))
  3. (if (vl-catch-all-error-p
  4.       (setq area (vl-catch-all-apply 'vlax-curve-getarea (list (ssname en 0))))
  5.      )
  6.   (princ "\nInvalid Object.")
  7. )
  8. )
  9. (setq area (rtos (/ area 144.0) 2 2))
  10. [color=magenta]...[/color]
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-9 20:54 , Processed in 0.392304 second(s), 72 queries .

© 2020-2025 乐筑天下

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