woodman78 发表于 2022-7-6 09:12:59

Lisp插入动态块

我想用lisp插入一个动态块,并在插入时利用块的对齐功能。这是我通常用来插入块的:
 
               (if (setq pt (setq INPT (getpoint "\nPick Insertion Point: ")))
                (command "_.-insert" block INPT "1" "1" "0"))))
 
我想插入块,但不是在运行命令之前选择输入,我希望能够选择屏幕上的点,并使块旋转以匹配基于对齐特征的线。
 
我该怎么做?

Tharwat 发表于 2022-7-6 09:22:53

你可以这样做。。。。
 

(defun c:test (/ name o e p1 p2 ins)
;; Tharwat 01. 07. 2011
(if (and (setq name (getstring T "\n Name of Block to insert :"))
          (tblsearch "BLOCK" name)
          (setq o (entsel "\n Select Line :"))
          (eq (cdr (assoc 0 (setq e (entget (car o))))) "LINE")
   )
   (progn
   (setq p1 (cdr (assoc 10 e))
         p2 (cdr (assoc 11 e))
   )
   (command "_.-insert" name p1 1. 1. 0.)
   (command "_.align"
            (entlast)
            ""
            (setq ins (cdr (assoc 10 (entget (entlast)))))
            p1
            (list (car ins) (+ (cadr ins) 0.5) 0.)
            p2
            ""
            ""
   )
   (redraw)
   )
   (princ "\n Block not found or Selection is not a line !! ")
)
(princ)
)

 
塔瓦特

woodman78 发表于 2022-7-6 09:29:49

谢谢Tharwat,
 
我试着画一条线,然后插入块。我修改了你的代码给我这个,但它找不到块。有什么想法吗?
 
(defun c:Guy_Rope (/ name o e p1 p2 ins)
;; Tharwat 01. 07. 2011

(command "_.-layer" "_N" "CCC_SURVEY_Existing Stay or Guy Rope" "_M" "CCC_SURVEY_Existing Stay or Guy Rope" "_C" "1" "CCC_SURVEY_Existing Stay or Guy Rope" "" )
(command "._pline")
(if (and (setq name "Guy_Rope_Survey")
          (tblsearch "BLOCK" name)
          (setq o (entsel "\n Select Line :"))
          (eq (cdr (assoc 0 (setq e (entget (car o))))) "LINE")
   )
   (progn
   (setq p1 (cdr (assoc 10 e))
         p2 (cdr (assoc 11 e))
   )
   (command "_.-insert" name p1 "1" "1" "0")
   (command "_.align"
            (entlast)
            ""
            (setq ins (cdr (assoc 10 (entget (entlast)))))
            p1
            (list (car ins) (+ (cadr ins) 0.5) 0.)
            p2
            ""
            ""
   )
   (redraw)
   )
   (princ "\n Block not found or Selection is not a line !! ")
)
(princ)
)

Tharwat 发表于 2022-7-6 09:35:07

这行不通,因为折线和直线不同,为什么要改变第一条线的想法?
 
实体线只有起点和终点,但多段线与此完全不同

woodman78 发表于 2022-7-6 09:45:37

嗯,我不知道有这么大的区别。不管怎样,我运行了你的例行程序,它确实与普林的工作。但它没有做我想要的,所以我回去重新写了一遍。这就是我现在拥有的:

(defun c:guy_rope1 (/ pline SUCE SUSM SUCL SUCR rope_block)
(setq SUCE (getvar "cmdecho"))
(setq SUSM (getvar "osmode"))
(setq SUCL (getvar "clayer"))
(setq SUCR (getvar "cecolor"))

(setq vl1 (list
       (cons 0 "LAYER")      ;Name of entity
       (cons 100 "AcDbSymbolTableRecord")                  ;Open Records
       (cons 100 "AcDbLayerTableRecord")                  ;Locate Layer Table
       (cons 2 "CCC_SURVEY_Existing Stay or Guy Rope")      ;Name of Layer
       (cons 62 1)                            ;colour = light grey
       (cons 70 0)                            ;state
       (cons 290 1)                            ;1=plot, 0=Don't plot
         )                            ;End of entity list
       )
       (entmake vl1)

(setvar "clayer" "CCC_SURVEY_Existing Stay or Guy Rope")
(setvar "cecolor" "Bylayer")

(princ "\nDraw an stay or guy rope line: ")
(setvar "plinegen" 1)
(command "._pline")
(while (= 1 (logand 1 (getvar "cmdactive")))
(command pause))
(setq pline (entlast)
elist (entget pline)
)
(setq name "guy_rope_survey")
(command ".-Insert" name pause pause "" )
(setq rope_block (entlast)
elist (entget rope_block)
)
(command "explode" rope_block)
(setvar "cmdecho"   SUCE)
(setvar "osmode" SUSM)
(setvar "clayer" SUCL)
(setvar "cecolor" SUCR)
(princ)
)
 
我有一些问题,也许有人可以帮我解决。这是例程的第一个aprt的命令转储:
命令:guy\u rope1
 
画一条拉线或拉线_普林线
指定起点:
当前线宽为0.0000
指定下一点或[弧/半宽/长度/撤消/宽度]:
指定下一点或[弧/闭合/半宽/长度/撤消/宽度]:
 
为什么会这样_普林出现了?
我的图层变量没有重置。我的图层没有恢复到原始值。
还有谁有更好的方法来运行insert,这样用户就可以使用动态块的对齐功能,而不必右键单击来完成命令?
 
谢谢

irneb 发表于 2022-7-6 09:50:24

可能是因为您没有将cmdecho设置为0?

BlackBox 发表于 2022-7-6 09:57:59

您是否考虑过改用vla insertBlock方法,然后简单地遍历动态块对象的属性(即可见性状态、属性等)?这真的很简单,而且更少(如果有的话?)系统变量需要存储/恢复。
 
(^^这是我为动态标题栏所做的^^)

woodman78 发表于 2022-7-6 10:04:17

不,我没有见过RenderMan。不过听起来很有趣。我该怎么做?

irneb 发表于 2022-7-6 10:12:01

看看我的附加代码。特别是块:GetParameters、块:GetParam、块:GetParamValue和块:PutParamValue函数。
 
除此之外,您需要掌握vla模型/图纸空间对象才能使用其vla InsertBlock方法。查看ActiveX/COM下的开发人员帮助。
区块数据。LSP

BlackBox 发表于 2022-7-6 10:19:26

 
Irneb花时间为您提供了一些帮助您的功能。
 
如果您无法理解这些函数和开发人员帮助之间需要什么,请发回您的问题,也许还有一份动态块的副本。
页: [1]
查看完整版本: Lisp插入动态块