这真是个绝妙的主意,我会花时间去做的 嗨,比格尔,
我可以再次使用(vla GetBoundingBox obj‘minpoint’maxpoint)方法来选择多段线内的文本,无需使用Alan H的代码
然后我使用txt2att lisp(粘贴在上面)将它们转换为块属性。这是成功的,他们仍然处于相同的地位
现在我的问题是,我们如何将这些属性转化为块?
如果我手动操作,我选择属性并使用命令“block”,然后输入块名,单击ok,ok。
在lisp中,我读到一些线程使用“insert”,但它的输入是文本值,我不知道它的标记会发生什么
其他一些线程建议使用“entmake”并定义块插入点,用属性插入点定义属性。。听起来工作量很大
我们有更简单的方法吗? 如果我看看这个例子。我对预期的结果感到惊讶。为什么要创建6个相同的块定义?为什么多个属性标记具有相同的名称(这很糟糕)?为什么随机插入点? 可以对属于现有块的属性进行排序。请参阅下面的代码。所以我之前的建议似乎是可行的。
遗憾的是,现有块也有一个随机插入点。但是(删除现有属性后)可以建立左下角。该点可用于计算新块的插入点。
(defun KGA_List_Divide_3 (lst / ret)
(repeat (/ (length lst) 3)
(setq ret (cons (list (car lst) (cadr lst) (caddr lst)) ret))
(setq lst (cdddr lst))
)
(reverse ret)
)
; (SortedAttValueList (car (entsel))) =>
; (
; (("DESC1" "AA") ("TETHERSOR" "10-10-00-00") ("TETHERQTY" "15"))
; (("DESC2" "BA") ("DFNENCLSOR" "07-07-01-09") ("DFNENCLNO" "1"))
; (("DESC3" "CA") ("SPLICESOR" "02-02-04-06") ("NOOFSPLICE" "10"))
; (("DESC4" "AB") ("SPLITSOR" "07-02-05-04") ("SPLITRQTY" "1"))
; (("DESC5" "AC") ("LFNOTDRSOR" "55-06-06-06") ("LFNQTY" "1"))
; (("DESC6" "DB") ("FIBERSOR" "22-04-03-05") ("FIBERQTY" "2"))
; )
(defun SortedAttValueList (enm / obj)
(setq obj (vlax-ename->vla-object enm))
(vl-sort
(mapcar
'(lambda (sub)
(mapcar 'cdr (vl-sort sub '(lambda (a b) (< (car a) (car b)))))
)
(KGA_List_Divide_3
(mapcar
'(lambda (att / tag)
(setq tag (strcase (vla-get-tagstring att)))
(list
(cond
((wcmatch tag "DESC*") 0)
((wcmatch tag "*SOR")1)
(T 2)
)
tag
(vla-get-textstring att)
)
)
(vlax-invoke obj 'getattributes)
)
)
)
'(lambda (a b) (< (caar a) (caar b)))
)
) 比格尔是根据臭名昭著的卡彭匪徒改编的。
Al是Alan的缩写
我想知道那个叫艾伦H的家伙是谁? 这是另一个变体
这不是lisp,而是一个程序
拆分块。拉链 代码很好,罗伊!我喜欢按wcmatch部分排序,您在其中使用了cond。 @Grrr:谢谢。我的第一个想法是在vl排序条件内使用wcmatch。但事实证明,这相当困难。
我认为您编写它的方式应该执行得更快,因为vl sort会尝试比较每一对项目,因此评估要多n倍。
所以总的来说,对于vl排序,我认为比较a和b的N次方对于大多数情况(如果不是全部的话)都足够了,就像你做的那样。 Roy_043,Grrr
如果块中有其他属性,你会怎么做?
因此完成#16
页:
1
[2]