从更新块属性
你好社区在为我的“问题”寻找了许多小时的解决方案后,我不得不注册一个网站,在那里,编程技能远远超过我。我的问题并不新鲜,但我无法找到一个简单的解决方案。就是这个。。。我希望在加载任何适用的图形时,使用excel电子表格中的句柄更新具有不同属性的各个块。
我有,我有
句柄|块名|属性1 |属性2 |属性3 |等。
我发现李Mac的更新标题栏属性和(我认为)这是类似的,我在一个不同的形式后,然而,我可能是错的。。。!
有人能给我建议吗?
非常感谢。 欢迎来到CADTutor。
我已经编写了这个例程,希望它能够满足您的需要,并被告知Excel文件必须具有扩展名。csv以允许代码选择它。
试试看,让我知道。
(defun c:Test (/ Deconstruct_Strings f o st bks ss l)
;; Author : Tharwat Al Shoufi ;;
;; Date : 15. April. 2014 ;;
(defun Deconstruct_Strings (string delimiter / pos lst)
(while (setq pos (vl-string-search delimiter string 0))
(progn (setq lst (cons (substr string 1 pos) lst))
(setq string (substr string (+ pos 2) (strlen string)))
)
)
(if string
(setq lst (cons string lst))
)
(setq lst (reverse lst))
)
(if (and (setq f (getfiled "Select Excel file to Update Attributes ..."
(getvar 'DWGPREFIX)
"csv"
16
)
)
(setq o (open f "r"))
)
(progn (while (setq st (read-line o))
(setq l (cons (Deconstruct_Strings st ";") l))
)
(setq bks
(apply 'strcat
(mapcar '(lambda (u) (strcat u ",")) (mapcar 'cadr l))
)
)
(close o)
)
)
(if (and bks
(setq
ss (ssget "_X" (list '(0 . "INSERT") '(66 . 1) (cons 2 bks)))
)
)
((lambda (i / sn h get e n)
(while (setq sn (ssname ss (setq i (1+ i))))
(setq h (cdr (assoc 5 (entget sn))))
(if (and l
(vl-some '(lambda (x)
(if (vl-some '(lambda (u) (eq u h)) x)
(setq get x)
)
)
l
)
)
(progn
(setq n 1
l (vl-remove get l)
)
(while
(/=
(cdr (assoc 0 (setq e (entget (setq sn (entnext sn)))))
)
"SEQEND"
)
(if (eq (cdr (assoc 0 e)) "ATTRIB")
(entmod (subst (cons 1 (nth (setq n (1+ n)) get))
(assoc 1 e)
e
)
)
)
)
)
)
)
)
-1
)
)
(princ)
)(vl-load-com)
塔瓦,我可能做错了什么。我的区块是具有两个属性的关键项目。
我的csv文件如下:句柄,关键项,4-DI,100
现有块属性为6-PVC和400
执行lisp时,图形中没有任何更改。
当然,“句柄”是通过在完成csv文件之前“列出”块来获得的,以获得句柄名称。
提前感谢您的帮助。
史蒂夫 Tharwat,请注意,CSV文件最常用逗号作为单元格分隔符(因此名为“逗号分隔值”);为了完全兼容,您需要考虑逗号和分号CSV分隔符(还要考虑这些分隔符或双引号字符是否在CSV单元格中显示为文字)。
另一方面,与其迭代图形数据库中给定名称的所有属性块,不如使用handent函数将句柄直接转换为块参照图元,从而处理所需的最小块数。
李 嗨,史蒂夫。
除了块属性的句柄和块名称之外,我不知道你的Excel文件的内容是什么,所以试着根据OP在Excel文件中的属性顺序来遵循帖子中的请求。
否则,您可能需要上载一个样例图形和一个样例Excel文件,用于为您检出它们。
猜测:尝试将例程中的分号替换为逗号,然后重试。
谢谢
我注意到分隔符会随着用户的变化而变化,但我仍然不知道何时需要考虑该分隔符,如果它是逗号或分号,尽管我在两个操作系统32和64上尝试了该代码,并且在两个系统中的结果是相同的,成功地完成了。
是的,这是个好主意
非常感谢。 请注意,尽管名称不同,CSV格式将使用Windows区域设置中设置的列表分隔符作为分隔符。 这是正确的Mircea。
这是李在他的一个套路中写的。
(vl-registry-read "HKEY_CURRENT_USER\\Control Panel\\International" "sList")
既然我们已经讨论了注册表,那么在AutoLISP中我们可能需要哪些其他信息,以及如何获取这些信息?
谢谢 但不要忘记,您将从注册表中检索到的是当前工作站的环境,不一定与创建CSV文件时使用的环境相似。 先生们
感谢您的关注(李的案例“荣幸”!)特别感谢你的努力。不幸的是,正如Stevesfr所说,在加载lisp例程时,这一行显示“选择Excel文件以更新属性…”不会出现在命令行上以允许其操作。至于“为什么”和“为什么”的错综复杂之处,我只能把我的帽子扔回拳击场,向你们致敬。我没想到这会引起这么有趣的对话! 上载带有excel文件的样例图形。
页:
[1]
2