乐筑天下

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

[编程交流] 需要基本LISP帮助

[复制链接]

2

主题

6

帖子

4

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 15:16:35 | 显示全部楼层 |阅读模式
我有一个重复的任务,涉及将房间区域插入属性块。目前,我正在使用标准的“区域”命令,从小数点开始倒数六位,在心里记下结果并将其插入块中,这在很长一段时间内变得很累并且容易出错。我相信一定有一个更简单的方法,但尽管我可能尝试,但我似乎无法掌握创建或修改甚至是一个简单的例程,成功地工作。
我正在运行Autocad 2008(十进制单位,1个单位代表1毫米)
 
程序要求如下:-
选择多段线(通过手动拾取)
计算面积(平方毫米)
换算为平方米(除以100000)
将结果减少到小数点后两位
复制到剪贴板
手动选择属性块
将平方米值粘贴到属性中
并用下一条多段线等重复
 
最初,我试图生成一个例程,该例程允许我选择多段线,然后选择块(它位于多段线边界内),并将区域插入属性中,但在编程过程中遇到了困难,选择了上面更简单的替代方案。
 
有谁能提供一些最简单的建议吗?
 
当做
回复

使用道具 举报

5

主题

194

帖子

193

银币

初来乍到

Rank: 1

铜币
24
发表于 2022-7-5 15:20:49 | 显示全部楼层
你能发布一个到目前为止你拥有的代码示例吗?
 
以上所有内容都可以通过lisp实现
回复

使用道具 举报

2

主题

6

帖子

4

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 15:25:14 | 显示全部楼层
杰米
希望我附上了两个文件供您参考
帕雷亚。lsp
平面布置图。图纸
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 15:27:22 | 显示全部楼层
我不久前为另一个线程写了这个,使用字段:
 
  1. (defun c:GetAreas (/ *error* lst->str DOC IDS PT SS UFLAG)
  2. (vl-load-com)
  3. ;; Lee Mac  ~  18.03.10
  4. (defun *error* (msg)
  5.    (and uFlag (vla-EndUndomark doc))
  6.    (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  7.        (princ (strcat "\n** Error: " msg " **")))
  8.    (princ))
  9. (defun GetObjectID (obj)
  10.    (setq util (cond (util) ((vla-get-Utility
  11.                               (vla-get-ActiveDocument (vlax-get-acad-object))))))
  12.    
  13.    (if (vl-string-search "X64" (strcase (getvar 'PLATFORM)))
  14.      (vlax-invoke-method util 'GetObjectIdString obj :vlax-false)
  15.      (itoa (vla-get-Objectid obj))))     
  16. (defun lst->str (lst d1 d2)
  17.    (if (cdr lst)
  18.      (strcat d1 (car lst) d2 (lst->str (cdr lst) d1 d2))
  19.      (strcat d1 (car lst))))
  20. (princ "\nSelect Objects to Retrieve Total Area... ")
  21. (if (and (ssget '((0 . "ARC,CIRCLE,ELLIPE,HATCH,*POLYLINE,REGION")))
  22.           (setq pt (getpoint "\nPick Point for Field: ")))
  23.    (progn
  24.      (setq uFlag (not (vla-StartUndoMark
  25.                         (setq doc (vla-get-ActiveDocument
  26.                                     (vlax-get-acad-object))))))
  27.      
  28.      (vlax-for obj (setq ss (vla-get-ActiveSelectionSet doc))
  29.        (setq Ids (cons (GetObjectID obj) Ids)))
  30.      (vla-delete ss)
  31.      (vla-AddMText
  32.        (if (or (eq AcModelSpace (vla-get-ActiveSpace doc))
  33.                (eq :vlax-true   (vla-get-MSpace doc)))
  34.          (vla-get-ModelSpace doc)
  35.          (vla-get-PaperSpace doc))
  36.        (vlax-3D-point pt) 0.
  37.        (if (= 1 (length Ids))
  38.          (strcat "%<\\AcObjProp Object(%<\\_ObjId " (car Ids) ">%).Area \\f "%lu6%qf1">%")
  39.          (strcat "%<\\AcExpr" (lst->str Ids " %<\\AcObjProp Object(%<\\_ObjId " ">%).Area >% +")
  40.                  ">%).Area >% \\f "%lu6%qf1">%")))
  41.      (setq uFlag (vla-EndUndomark doc))))
  42. (princ))
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 15:31:06 | 显示全部楼层
或用于放置到现有文本/属性中:
 
  1. (defun c:GetAreas (/ *error* lst->str GetObjectID DOC ENT IDS SS UFLAG UTIL)
  2. (vl-load-com)
  3. ;; Lee Mac  ~  18.03.10
  4. (defun *error* (msg)
  5.    (and uFlag (vla-EndUndomark doc))
  6.    (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  7.        (princ (strcat "\n** Error: " msg " **")))
  8.    (princ))
  9. (defun GetObjectID (obj)
  10.    (setq util (cond (util) ((vla-get-Utility
  11.                               (vla-get-ActiveDocument (vlax-get-acad-object))))))
  12.    
  13.    (if (vl-string-search "X64" (strcase (getvar 'PLATFORM)))
  14.      (vlax-invoke-method util 'GetObjectIdString obj :vlax-false)
  15.      (itoa (vla-get-Objectid obj))))     
  16. (defun lst->str (lst d1 d2)
  17.    (if (cdr lst)
  18.      (strcat d1 (car lst) d2 (lst->str (cdr lst) d1 d2))
  19.      (strcat d1 (car lst))))
  20. (princ "\nSelect Objects to Retrieve Total Area... ")
  21. (if (and (ssget '((0 . "ARC,CIRCLE,ELLIPE,HATCH,*POLYLINE,REGION")))
  22.           (setq ent (car (nentsel "\nSelect Text, MText or Attrib to Place: ")))
  23.           (wcmatch (cdr (assoc 0 (entget ent))) "*TEXT,ATTRIB"))                          
  24.    (progn
  25.      (setq uFlag (not (vla-StartUndoMark
  26.                         (setq doc (vla-get-ActiveDocument
  27.                                     (vlax-get-acad-object))))))
  28.      
  29.      (vlax-for obj (setq ss (vla-get-ActiveSelectionSet doc))
  30.        (setq Ids (cons (GetObjectID obj) Ids)))
  31.      (vla-delete ss)
  32.      (vla-put-TextString
  33.        (vlax-ename->vla-object ent)
  34.        (if (= 1 (length Ids))
  35.          (strcat "%<\\AcObjProp Object(%<\\_ObjId " (car Ids) ">%).Area \\f "%lu6%qf1">%")
  36.          (strcat "%<\\AcExpr" (lst->str Ids " %<\\AcObjProp Object(%<\\_ObjId " ">%).Area >% +")
  37.                  ">%).Area >% \\f "%lu6%qf1">%")))
  38.      (vla-regen doc acActiveViewport)
  39.      (setq uFlag (vla-EndUndomark doc))))
  40. (princ))
回复

使用道具 举报

2

主题

6

帖子

4

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 15:33:24 | 显示全部楼层
非常感谢您的及时回复。我在这件事上胡闹了好几年,但都没有成功。您发送的用于将区域加载到属性中的第二个例程完全没有从平方毫米到平方米的转换。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 15:38:01 | 显示全部楼层
别担心,弗兰克
 
  1. (defun c:GetAreas (/ *error* lst->str GetObjectID DOC ENT IDS SS UFLAG UTIL)
  2. (vl-load-com)
  3. ;; Lee Mac  ~  18.03.10
  4. (defun *error* (msg)
  5.    (and uFlag (vla-EndUndomark doc))
  6.    (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  7.        (princ (strcat "\n** Error: " msg " **")))
  8.    (princ))
  9. (defun GetObjectID (obj)
  10.    (setq util (cond (util) ((vla-get-Utility
  11.                               (vla-get-ActiveDocument (vlax-get-acad-object))))))
  12.    
  13.    (if (vl-string-search "X64" (strcase (getvar 'PLATFORM)))
  14.      (vlax-invoke-method util 'GetObjectIdString obj :vlax-false)
  15.      (itoa (vla-get-Objectid obj))))     
  16. (defun lst->str (lst d1 d2)
  17.    (if (cdr lst)
  18.      (strcat d1 (car lst) d2 (lst->str (cdr lst) d1 d2))
  19.      (strcat d1 (car lst))))
  20. (princ "\nSelect Objects to Retrieve Total Area... ")
  21. (if (and (ssget '((0 . "ARC,CIRCLE,ELLIPE,HATCH,*POLYLINE,REGION")))
  22.           (setq ent (car (nentsel "\nSelect Text, MText or Attrib to Place: ")))
  23.           (wcmatch (cdr (assoc 0 (entget ent))) "*TEXT,ATTRIB"))                          
  24.    (progn
  25.      (setq uFlag (not (vla-StartUndoMark
  26.                         (setq doc (vla-get-ActiveDocument
  27.                                     (vlax-get-acad-object))))))
  28.      
  29.      (vlax-for obj (setq ss (vla-get-ActiveSelectionSet doc))
  30.        (setq Ids (cons (GetObjectID obj) Ids)))
  31.      (vla-delete ss)
  32.      (vla-put-TextString
  33.        (vlax-ename->vla-object ent)
  34.        (if (= 1 (length Ids))
  35.          (strcat "%<\\AcObjProp Object(%<\\_ObjId " (car Ids) ">%).Area \\f "%lu6%qf1%ct8[1e-6]">%")
  36.          (strcat "%<\\AcExpr" (lst->str Ids " %<\\AcObjProp Object(%<\\_ObjId " ">%).Area >% +")
  37.                  ">%).Area >% \\f "%lu6%qf1%ct8[1e-6]">%")))
  38.      (vla-regen doc acActiveViewport)
  39.      (setq uFlag (vla-EndUndomark doc))))
  40. (princ))
回复

使用道具 举报

2

主题

6

帖子

4

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 15:38:53 | 显示全部楼层
现在很完美,我有3000个房间属性可以插入到建筑楼层布局中,这将使它变得更容易,真是太感谢你了
当做
直率的
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 15:42:50 | 显示全部楼层
很高兴帮助Frank
回复

使用道具 举报

2

主题

6

帖子

4

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 15:45:22 | 显示全部楼层
 
杰米
我很高兴地报告已找到解决方案,感谢您的友好帮助
当做
直率的
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 13:04 , Processed in 0.793361 second(s), 73 queries .

© 2020-2025 乐筑天下

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