Newby Bern 发表于 2022-7-5 23:07:59

从更新块属性

你好社区
 
在为我的“问题”寻找了许多小时的解决方案后,我不得不注册一个网站,在那里,编程技能远远超过我。我的问题并不新鲜,但我无法找到一个简单的解决方案。就是这个。。。我希望在加载任何适用的图形时,使用excel电子表格中的句柄更新具有不同属性的各个块。
 
我有,我有
 
句柄|块名|属性1 |属性2 |属性3 |等。
 
我发现李Mac的更新标题栏属性和(我认为)这是类似的,我在一个不同的形式后,然而,我可能是错的。。。!
 
有人能给我建议吗?
 
非常感谢。

Tharwat 发表于 2022-7-5 23:12:41

欢迎来到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)

stevesfr 发表于 2022-7-5 23:14:27

塔瓦,我可能做错了什么。我的区块是具有两个属性的关键项目。
我的csv文件如下:句柄,关键项,4-DI,100
现有块属性为6-PVC和400
执行lisp时,图形中没有任何更改。
当然,“句柄”是通过在完成csv文件之前“列出”块来获得的,以获得句柄名称。
提前感谢您的帮助。
史蒂夫

Lee Mac 发表于 2022-7-5 23:19:34

Tharwat,请注意,CSV文件最常用逗号作为单元格分隔符(因此名为“逗号分隔值”);为了完全兼容,您需要考虑逗号和分号CSV分隔符(还要考虑这些分隔符或双引号字符是否在CSV单元格中显示为文字)。
 
另一方面,与其迭代图形数据库中给定名称的所有属性块,不如使用handent函数将句柄直接转换为块参照图元,从而处理所需的最小块数。
 

Tharwat 发表于 2022-7-5 23:22:58

嗨,史蒂夫。
 
除了块属性的句柄和块名称之外,我不知道你的Excel文件的内容是什么,所以试着根据OP在Excel文件中的属性顺序来遵循帖子中的请求。
否则,您可能需要上载一个样例图形和一个样例Excel文件,用于为您检出它们。
 
猜测:尝试将例程中的分号替换为逗号,然后重试。
 
谢谢
 
 
 
我注意到分隔符会随着用户的变化而变化,但我仍然不知道何时需要考虑该分隔符,如果它是逗号或分号,尽管我在两个操作系统32和64上尝试了该代码,并且在两个系统中的结果是相同的,成功地完成了。
 
 
是的,这是个好主意
 
非常感谢。

MSasu 发表于 2022-7-5 23:25:52

请注意,尽管名称不同,CSV格式将使用Windows区域设置中设置的列表分隔符作为分隔符。

Tharwat 发表于 2022-7-5 23:30:04

这是正确的Mircea。
 
这是李在他的一个套路中写的。
 

(vl-registry-read "HKEY_CURRENT_USER\\Control Panel\\International" "sList")

 
既然我们已经讨论了注册表,那么在AutoLISP中我们可能需要哪些其他信息,以及如何获取这些信息?
 
谢谢

MSasu 发表于 2022-7-5 23:32:41

但不要忘记,您将从注册表中检索到的是当前工作站的环境,不一定与创建CSV文件时使用的环境相似。

Newby Bern 发表于 2022-7-5 23:34:20

先生们
 
感谢您的关注(李的案例“荣幸”!)特别感谢你的努力。不幸的是,正如Stevesfr所说,在加载lisp例程时,这一行显示“选择Excel文件以更新属性…”不会出现在命令行上以允许其操作。至于“为什么”和“为什么”的错综复杂之处,我只能把我的帽子扔回拳击场,向你们致敬。我没想到这会引起这么有趣的对话!

Tharwat 发表于 2022-7-5 23:37:27

上载带有excel文件的样例图形。
页: [1] 2
查看完整版本: 从更新块属性