gilsoto13 发表于 2022-7-6 11:29:46

如何从差异中获取值

嗨,伙计们。。
 
这不是一项重要的任务,但它每天都会帮我一点忙。。。
 
我想找到一个例程,允许我在模型或图纸空间中拾取一个对象,文字、多行文字、块、引线或尺寸,并自动更新dimscale因子,取拾取的对象的值。
 
-从文字或多行文字高度,Dimscale=(文字高度)*8
-从块x值因子,Dimscale=(块x值因子)正值(如果为负值)
-从标注或引线,Dimscale=Dimscale因子
 
这将用于使用lispt更新其他对象,从另一个对象获取Dimscale。

BearDyugin 发表于 2022-7-6 11:33:49

这意味着维度或引线的“Dimscale因子”,我假设它是一个LinearScaleFactor,但它仅在维度上?
(defun get_dimscal ( obj / type_obj)
(vl-load-com)
(if (setq type_obj (cdr(assoc 0 (entget obj ))))
   (cond
   ((wcmatch type_obj "*TEXT")(* (cdr(assoc 40 (entget obj))) )
   ((eq type_obj "INSERT")(abs (cdr (assoc 41 (entget obj)))))
   ((eq type_obj "DIMENSION")(vla-get-LinearScaleFactor(vlax-ename->vla-Object obj)))
   (T T)
   )))
 
功能测试已选择高度为5的М文本

gilsoto13 发表于 2022-7-6 11:37:47

 
嗯。。。我不知道。。。我会测试它添加领导类型。。。然后检查发生了什么。。
 
但这似乎是正确的代码。。。但我不能测试它。。。因为我不是程序员,我只是不知道问题出在哪里。。
 
我没有将其作为子功能进行检查,只是添加了c:
但我有这个
 
命令:get\u dimscal
; 错误:参数太少
 
有什么想法吗?

Lee Mac 发表于 2022-7-6 11:40:31

该函数是一个子函数,需要一个实体(ename)参数。

gilsoto13 发表于 2022-7-6 11:44:27

 
嗯,我明白。。。但无论我试着用Lisp程序的Lisp程序来完成它多少次。。。我的编码知识相当基础。。。。我想我的下一步将是阅读和理解手册,或只是试图找到一个类似的lisp来理解它。。。但是。。。
 
到目前为止,这是一个良好的开端。
 
我想差不多了
 

;;
(defun get_dimscal ( obj / type_obj)
(vl-load-com)
(if (setq type_obj (cdr(assoc 0 (entget obj ))))
   (cond
   ((wcmatch type_obj "*TEXT")(* (cdr(assoc 40 (entget obj))) )
   ((eq type_obj "INSERT")(abs (cdr (assoc 41 (entget obj)))))
   ((eq type_obj "DIMENSION")(vla-get-LinearScaleFactor(vlax-ename->vla-Object obj)))
   (T T)
   )))

(defun c:ddddd ()
(princ (get_dimscal (car (entsel))))
)


 
我得到了这个值,但是如何用它来改变dimscale变量呢?
 
哦哦。。。
 
我得到了它。。
 

;; It automatically changes the dimscale factor taking it from a
;; selected object
;; Geobuilder -- 2010
;; http://www.cadtutor.net/forum/showthread.php?p=304557#post304557
;; SUB-FUNCTION
(defun get_dimscal ( obj / type_obj)
(vl-load-com)
(if (setq type_obj (cdr(assoc 0 (entget obj ))))
   (cond
   ((wcmatch type_obj "*TEXT")(* (cdr(assoc 40 (entget obj))) )
   ((eq type_obj "INSERT")(abs (cdr (assoc 41 (entget obj)))))
   ((eq type_obj "DIMENSION")(vla-get-LinearScaleFactor(vlax-ename->vla-Object obj)))
   (T T)
   )))
(defun c:dre ()
(setvar "dimscale" (get_dimscal (car (entsel))))
)


 
你们这些家伙。。。。效果很好

Lee Mac 发表于 2022-7-6 11:49:45

GeoBuilder发布了一个如何使用它的示例

Lee Mac 发表于 2022-7-6 11:51:03

吉尔索托,
 
不确定您真正想要做什么,或者在维度/领导者方面需要什么,但如果我理解正确:
 

(defun c:MrGilsoto (/ dxf ent)

(defun dxf (code ent) (cdr (assoc code (entget ent))))

(cond ((setq ent (car (entsel)))

          (setvar 'DIMSCALE

            (cond ((wcmatch (dxf 0 ent) "TEXT,MTEXT") (* 8. (dxf 40 ent)))

                  ((eq "INSERT" (dxf 0 ent)) (dxf 41 ent))
                        
                  ((getvar "DIMSCALE"))))))
(princ))

gilsoto13 发表于 2022-7-6 11:53:46

哦。。。
 
是的,我在维度和领导者方面有问题。。。
哎哟。。。我只是去张贴这个帖子没有太多的调查。。。
关于尺寸和引线,我需要运行命令,而不是获取LinearScaleFactor,对于这些对象,我需要运行
命令“dimstyle”“restore”。因此dimscale值得到更新。
 
如果我能自己做,我会检查一下。
 
 
 
努普。。。我在Geobuilder的lisp中尝试了该命令和vl cmdf,但在输入错误时得到了格式不正确的列表。
 
我在你的Lisp中添加了一行尺寸,Lee,但我不知道尺寸样式中dimscale因子的dxf代码。。。我又有点困了,但块、文本和多行文字在两种lisp例程中都很好地工作。

Lee Mac 发表于 2022-7-6 11:58:03

这将根据选定对象的dimstyle设置DIMSCALE,但不使用恢复:
 

(defun c:MrGilsoto (/ dxf ent)

(defun dxf (code ent) (cdr (assoc code (entget ent))))

(cond ((setq ent (car (entsel)))

          (setvar 'DIMSCALE

            (cond ((wcmatch (dxf 0 ent) "TEXT,MTEXT") (* 8. (dxf 40 ent)))

                  ((eq "INSERT" (dxf 0 ent)) (dxf 41 ent))

                  ((wcmatch (dxf 0 ent) "DIMENSION,*LEADER")

                     (cdr (assoc 40 (tblsearch "DIMSTYLE" (dxf 3 ent)))))

                  ((getvar "DIMSCALE"))))))
(princ))

 
PS>到底是做什么的:“ouk”和“nooup”,。。意思是

gilsoto13 发表于 2022-7-6 12:02:12

jjajaja,也加上这个:
是的。。
 
他们的意思是
哦。。。哎哟。。。平均ok
无。。。没错。。表示否
是的。。。是的,是的
 
 
 
 
是的。。。这就是我的意思。。。现在我有了一个全新的工具来更新我的东西。。。
 
谢谢李。。。。现在我可以休息一下,然后检查另一个。。。
页: [1] 2
查看完整版本: 如何从差异中获取值