面积提取
大家好,我为房间的面积绘制了一些多段线。
我还有房间标记,它们是使用多行属性作为房间名称的块。
我必须做一个程序,循环拾取每个pline的过程,然后是相应的房间标签,最后将整个数据写入csv文件。
要写入的数据类似于;
房间1,50.00,30.00
Room1是从多行属性中提取的。50.00是面积,30.00是周长。
这是代码。
但它会给多行属性带来麻烦。
(defun c:ArToEx()
(setq n 1)
(while (> n 0)
(Progn
(prompt "\n")
(command "AREA" "e" (entsel))
(setq ent-area (getvar"area"))
(princ)
(setq Perimeter (getvar"perimeter"))
(sk)
(setq n (+ 1 n))
)
)
)
(defun sk (/ dxf ent)
(defun dxf (code ent) (cdr (assoc code (entget ent))))
(if (and (setq ent (car (entsel "\nSelect an Attributed Block: ")))
(eq "INSERT" (dxf 0 ent))
(= 1 (dxf 66 ent)))
(while (not (eq "SEQEND" (dxf 0 (setq ent (entnext ent)))))
(progn
(princ (strcat "\n---------------------------------------- " (dxf 1 ent)))
(prompt (strcat ", " (rtos ent-area)))
(prompt (strcat ", " (rtos Perimeter)))
)
)
)
(princ))
现在,我让它在命令行上提示数据。我不知道如何将其导出为csv。
此外,多行属性也带来了麻烦。
请帮忙。。。 是的,当直接在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中打开时也不会添加额外的列。 为什么不将房间面积和周长添加到房间块中,并且它可以是一个字段,因此如果形状发生更改,则会更新值,如果需要,可以从视图中隐藏属性。对我来说,只做一步而不是两步是有道理的。您可以轻松地使用所有工具,如数据提取。 比加尔,
谢谢你的回复。如果房间是矩形或任何规则形状,我可以为房间做一个方块。在这种特殊情况下,房间具有不规则形状,带有曲线和角线。所以建造一个房间街区是行不通的。 irneb,
谢谢。。。你的回答很有用。
但是如何将csv文件保存在与图形文件相同的位置?
我尝试了一些东西来提取图形的路径信息;
4
但是路径字符串有“\”,这是lisp不能接受的。
我该怎么做? 比格尔的建议适用于其他形状,而不仅仅是矩形。只需将字段放置到指向多段线面积特性的属性中。我广泛使用这种方法,甚至可以将房间标记与多段线一起复制,然后将新的多段线调整为不同的形状/大小。查看我的Caddons/dimultils中的DimArea代码。LSP。它将字段放置到任意文本/多行文字/属性中的多条多段线(添加和/或减去)。
无论如何,DwgPrefix只提供保存图形的文件夹路径。您需要在其上附加一个文件名(您不能直接保存到文件夹本身)。所以你可以用这样的东西:
5
页:
[1]