乐筑天下

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

[编程交流] 面积提取

[复制链接]

30

主题

96

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
150
发表于 2022-7-6 09:08:22 | 显示全部楼层 |阅读模式
大家好,
我为房间的面积绘制了一些多段线。
我还有房间标记,它们是使用多行属性作为房间名称的块。
我必须做一个程序,循环拾取每个pline的过程,然后是相应的房间标签,最后将整个数据写入csv文件。
要写入的数据类似于;
 
房间1,50.00,30.00
 
Room1是从多行属性中提取的。50.00是面积,30.00是周长。
 
这是代码。
但它会给多行属性带来麻烦。
 
  1. (defun c:ArToEx()
  2. (setq n 1)
  3. (while (> n 0)
  4.           (Progn
  5.                   (prompt "\n")
  6.                         (command "AREA" "e" (entsel))
  7.                         (setq ent-area (getvar"area"))
  8.                   (princ)
  9.                   (setq Perimeter (getvar"perimeter"))
  10.                   (sk)
  11.                   (setq n (+ 1 n))
  12.         )
  13. )
  14. )
  15. (defun sk (/ dxf ent)
  16. (defun dxf (code ent) (cdr (assoc code (entget ent))))
  17. (if (and (setq ent (car (entsel "\nSelect an Attributed Block: ")))
  18.           (eq "INSERT" (dxf 0 ent))
  19.           (= 1 (dxf 66 ent)))
  20.    (while (not (eq "SEQEND" (dxf 0 (setq ent (entnext ent)))))
  21. (progn
  22.                  (princ (strcat "\n---------------------------------------- " (dxf 1 ent)))
  23.                (prompt (strcat ", " (rtos ent-area)))
  24.     (prompt (strcat ", " (rtos Perimeter)))
  25. )
  26.    )
  27. )
  28. (princ))

 
现在,我让它在命令行上提示数据。我不知道如何将其导出为csv。
此外,多行属性也带来了麻烦。
 
请帮忙。。。
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 09:25:17 | 显示全部楼层
是的,当直接在DXF中工作时,多行属性可能会有一些麻烦。它不再像只检查1 DXF代码那么简单了,它变得类似于多行文字,也可能有几个3代码。为此,我建议您尝试使用属性的activex对象,然后使用其vla get TextString函数。此外,多行可能包含格式代码(尤其是新行),因此您可能希望将其转换为其他类型的字符-您可能希望使用vl字符串翻译来实现这一点:wink:
 
至于写入CSV,这相当“简单”:您可以使用以下内容打开文本文件:
我在路径中使用正斜杠而不是双反斜杠(但它们的工作原理相同)。末尾的“w”告诉open函数您要覆盖或创建新文件。“r”将以只读模式打开文件,“A”将以附加模式打开文件。
 
之后,f包含打开的文件句柄。因此,您可以将其添加到任何原则中:
现在要添加换行符,通常需要在每行的末尾添加一个返回换行符:
所以基本上你需要什么;我们已经进入了princ&下面是promt调用(只需将提示符也更改为princ,并将文件的句柄作为参数添加到末尾)。
 
在你写了所有你想要的文件后,使用(关闭f)来释放句柄,这样其他程序就可以打开它了。
 
我还建议您将任何文本值用引号括起来,如果文本中有逗号,也可能与CSV文件发生冲突。你想要的是这样的:
“Room1”,50.0,30.0
 
这样,即使文件室的描述包含逗号,在Excel中打开时也不会添加额外的列。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 09:35:08 | 显示全部楼层
为什么不将房间面积和周长添加到房间块中,并且它可以是一个字段,因此如果形状发生更改,则会更新值,如果需要,可以从视图中隐藏属性。对我来说,只做一步而不是两步是有道理的。您可以轻松地使用所有工具,如数据提取。
回复

使用道具 举报

30

主题

96

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
150
发表于 2022-7-6 09:50:29 | 显示全部楼层
比加尔,
谢谢你的回复。如果房间是矩形或任何规则形状,我可以为房间做一个方块。在这种特殊情况下,房间具有不规则形状,带有曲线和角线。所以建造一个房间街区是行不通的。
回复

使用道具 举报

30

主题

96

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
150
发表于 2022-7-6 09:59:58 | 显示全部楼层
irneb,
谢谢。。。你的回答很有用。
但是如何将csv文件保存在与图形文件相同的位置?
我尝试了一些东西来提取图形的路径信息;
  1. 4

但是路径字符串有“\”,这是lisp不能接受的。
我该怎么做?
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 10:14:21 | 显示全部楼层
比格尔的建议适用于其他形状,而不仅仅是矩形。只需将字段放置到指向多段线面积特性的属性中。我广泛使用这种方法,甚至可以将房间标记与多段线一起复制,然后将新的多段线调整为不同的形状/大小。查看我的Caddons/dimultils中的DimArea代码。LSP。它将字段放置到任意文本/多行文字/属性中的多条多段线(添加和/或减去)。
 
无论如何,DwgPrefix只提供保存图形的文件夹路径。您需要在其上附加一个文件名(您不能直接保存到文件夹本身)。所以你可以用这样的东西:
  1. 5
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 05:06 , Processed in 0.335548 second(s), 64 queries .

© 2020-2025 乐筑天下

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