ollie 发表于 2022-7-6 10:32:52

Entmake 0。插入属性

大家好
 
我正在尝试用autolisp编写一个块替换工具。(我用vba编写了这个工具,它很简单)遗憾的是,lisp没有vba那么简单。
 
到目前为止,脚本遵循以下过程
 
-选择所有特定类型的块“SSGET”
-为每个块创建一个列表
((输入)(属性详细信息)(附件…)
-创建新块
-添加额外属性
 
 
问题是我找不到一种插入新锁的实用方法。如果一个块有四个属性,那么(命令“insert”)需要9个参数(5个默认值),这不是很实用,因为需要为每个属性块重写重新插入函数。
 
有没有关于使用entmake插入块>
 
如果您对此有任何想法,我们将不胜感激
 
编辑:
 
即使有一种在不知道属性数量的情况下使用默认值的方法,问题也可以解决
 
编辑:
 
多亏了Buzzard
 
http://www.cadtutor.net/forum/showthread.php?t=36793
 
谢谢
奥利

Lee Mac 发表于 2022-7-6 10:37:06

是的,我认为有三种(可能更多的方法)可以做到这一点:
 
1) (setvar“ATTREQ”0);;不提示输入属性,然后(命令“-insert”。。。
 
2) Entmake the INSERT definition(假设表中存在块定义):
 
类似于:
 

(entmake (list (cons 0 "INSERT") (cons 2 bn) (cons 8 "0") (cons 10 pt)))

 
这是一个很好的例子:
 

(defun c:obj2blk1 (/ ss bn pt i ent elist)

; Get Entities

   (while (not ss)
   (princ "\nSelect Objects to Convert to Blocks:")
   (setq ss (ssget '((-4 . "<NOT") (0 . "INSERT,POLYLINE,VIEWPORT") (-4 . "NOT>"))))
   ) ;_end while

; Get Block Name and Base Point

   (while (or (not bn)
          (not (snvalid bn))
      ) ;_end or
   (setq bn (getstring "Specify Block Name: "))
   ) ;_end while

   (initget 1)
   (setq pt (getpoint "Specify Base Point for Block: "))

;;; Create BLOCK Header
   (entmake (list (cons 0 "BLOCK") (cons 10 pt) (cons 2 bn) (cons 70 0)))

;;;STEP THRU THE SET
   (setq i (sslength ss))
   (while (>= i (setq i (1- i)) 0)
   (setq ent   (ssname ss i)
         elist (entget ent)
   ) ;_end setq
   (entmake elist)
   ) ;_end while

;;;FINISH THE BLOCK DEFINITION
   (entmake (list (cons 0 "ENDBLK") (cons 8 "0")))

;;;Insert the Block & Delete Originals
   (entmake (list (cons 0 "INSERT") (cons 2 bn) (cons 8 "0") (cons 10 pt)))
   (command "_.ERASE" ss "")
   (redraw)
   (prin1)
) ;_end defun

 
以上是我与David Bethel合作的代码,它将自动从对象的选择集生成一个块。
 
3) 使用VL方法:
 

(vla-insertblock <space> <pt>... etc)

 
希望这有帮助
 

ollie 发表于 2022-7-6 10:41:23

谢谢李
 
不幸的是,我仍然有问题,这是我到目前为止的功能
 
现在返回
命令:;错误:ActiveX服务器返回错误:未知名称:HasAttributes
 
有一次返回:对于hasattribtues,vla false
奥利

Lee Mac 发表于 2022-7-6 10:44:49

奥利,“attlist”参数的格式是什么?

ollie 发表于 2022-7-6 10:47:02

 
这是列表格式
 

(
(63562.0 82951.4 0.0)
(Tag Textvalue height visibleLAYERNAME "prompt")
(Tag Textvalue300.0 :vlax-false LAYERNAME "prompt")
(Tag Textvalue300.0 :vlax-false LAYERNAME "prompt")
(Tag Textvalue300.0 :vlax-true LAYERNAME "prompt")
(Tag Textvalue300.0 :vlax-true LAYERNAME "prompt")
(Tag Textvalue300.0 :vlax-true LAYERNAME "prompt")
)

Lee Mac 发表于 2022-7-6 10:48:48

可以尝试以下方法:
 

(defun InsertBlock(attlist bname / c ent tag)
(if (and (setq blk
               (entmakex
                   (list
                     (cons 0 "INSERT")
                     (cons 2 bname)
                     (cons 66 1)
                     (cons 10 (car attlist)))))
          (setq blk (vlax-ename->vla-object blk)))
   (if (eq (vla-get-hasattributes blk) :vlax-true)
   (progn
       (foreach att(vlax-safearray->list
                     (vlax-variant-value
                         (vla-getattributes blk)))
         (setq tag (vla-get-tagstring att))
         (princ (strcat "\n" tag))
         (foreach nattlist
         (if (= (car n) tag)
             (vla-put-textstring att (cadr n)))))))))

Lee Mac 发表于 2022-7-6 10:52:33

另一个,使用VL:
 

(defun InsertBlock(attlst bname / c ent tag)
(vl-load-com)
(if (vl-catch-all-error-p
       (vl-catch-all-apply
         (function
         (lambda ( )
             (setq blk
               (vla-insertblock
               (vla-get-ModelSpace
                   (vla-get-ActiveDocument
                     (vlax-get-acad-object)))
               (vlax-3D-point (car attlst)) bName 1. 1. 1. 0.)))))) nil
   (if (eq :vlax-true (vla-get-HasAttributes blk))
   (foreach att (vlax-safearray->list
                  (vlax-variant-value
                      (vla-getAttributes blk)))
       (princ (strcat "\n" (setq tag (vla-get-tagString att))))
       (foreach x (cdr attlst)
         (if (eq tag (car x))
         (vla-put-TextString att (cadr x))))))))

The Buzzard 发表于 2022-7-6 10:57:51

 
 
奥利,
 
我在entmake上为块提供的线程我发现不是一个非常实用的方法。你将做两倍的工作,做一个漫长的过程只是为了使一个块。不是很理想。虽然这样创建一个积木很有意思,也有很好的学习体验,但我不赞成这种方法。我现在尝试学习一些VL方法作为替代方法。VL虽然看起来很复杂,但从长远来看,你很可能会避免头痛。
 
以下方法使用insert命令。这些不是VL程序。他们会告诉你我经历了什么。看看他们。在看过这些套路之后,你可能想学习VL。
 
祝你好运
秃鹰
SL.zip
IDS_V1.03。拉链

Lee Mac 发表于 2022-7-6 10:58:36

我认为奥利只想做插入定义,而不是块定义,所以我认为这对他来说不会太糟糕。
 

The Buzzard 发表于 2022-7-6 11:02:08

 
我不确定,没问题。他得到了很好的照顾。
页: [1] 2
查看完整版本: Entmake 0。插入属性