K Baden 发表于 2022-7-5 15:33:40

参数过多问题

大家早上好!
我很难想出如何正确修复以下代码。我在强调的部分中得到了太多的论点,这对我来说很有意义,但我不完全确定该怎么解决。我需要在更改之前添加程序吗?任何帮助都将不胜感激!
 
我基本上希望它捕捉到特定层上的所有块内图案填充和实体,然后更改每个块的图案、比例和背景色。我认为我的过程是正确的,但当我有3个限定符时,我不认为是否/和是正确的。提前感谢您的帮助!
 
(defun c:planproposedhatch (/ doc)
(or *colorobject*
   (setq *colorobject*
   (vla-getinterfaceobject
       (vlax-get-acad-object)
       (strcat "AutoCAD.AcCmColor." (substr (getvar "acadver") 1 2))
   )
   )
)
(if
   (null (vl-catch-all-error-p (vl-catch-all-apply 'vla-setrgb (list *colorobject* 255 255 255))))
    (progn (vlax-for blk (vla-get-blocks (setq doc (vla-get-Activedocument (vlax-get-acad-object))))
      (if (= :vlax-false (vla-get-isxref blk))
        (vlax-for obj blk
          (if (and (= "08_Proposed Data" (strcase (vla-get-layer obj)))
                   (= "AcDbHatch" (vla-get-objectname obj))
                   (= "SOLID" (strcase (vla-get-patternname obj)))
                   (vlax-write-enabled-p obj)
              )
          (vl-catch-all-apply 'vla-put-patternname obj ANSI31)
          (vl-catch-all-apply 'vla-put-ScaleFactor obj 12)
          (vl-catch-all-apply 'vla-put-backgroundcolor (list obj *colorobject*))
          )
        )
      )
    )
    (vla-regen doc acallviewports)
    )
)
(princ)
)
(vl-load-com)
(princ)

Tharwat 发表于 2022-7-5 15:42:15

你好
 
如果您想使用If函数执行多次操作,则需要使用progn函数。
 

(progn
                   (vl-catch-all-apply 'vla-put-patternname obj ANSI31)
          (vl-catch-all-apply 'vla-put-ScaleFactor obj 12)
          (vl-catch-all-apply 'vla-put-backgroundcolor (list obj *colorobject*))
)

ronjonp 发表于 2022-7-5 15:48:32

您也可以像这样使用COND:

(cond ((and (= "08_Proposed Data" (strcase (vla-get-layer obj)))
    (= "AcDbHatch" (vla-get-objectname obj))
    (= "SOLID" (strcase (vla-get-patternname obj)))
    (vlax-write-enabled-p obj)
      )
      (vl-catch-all-apply 'vla-put-patternname obj ansi31)
      (vl-catch-all-apply 'vla-put-scalefactor obj 12)
      (vl-catch-all-apply 'vla-put-backgroundcolor (list obj *colorobject*))
   )
)
尽管你的测试在这里总是会失败:
(= "08_Proposed Data" (strcase (vla-get-layer obj)))
你明白为什么了吗?

K Baden 发表于 2022-7-5 15:51:20

这会因为strcase而失败吗?

ronjonp 发表于 2022-7-5 15:55:46

 
答对 了

Tharwat 发表于 2022-7-5 16:01:08

 
除了上述其他错误外,没有函数定义vla put patternname,因此请尝试以下操作:

(if
   (null (vl-catch-all-error-p (vl-catch-all-apply 'vla-setrgb (list *colorobject* 255 255 255))))
    (progn (vlax-for blk (vla-get-blocks (setq doc (vla-get-Activedocument (vlax-get-acad-object))))
      (if (= :vlax-false (vla-get-isxref blk))
        (vlax-for obj blk
          (if (and (vlax-write-enabled-p obj)
                        (= "08_PROPOSED DATA" (strcase (vla-get-layer obj)))
                   (= "AcDbHatch" (vla-get-objectname obj))
                   (= "SOLID" (strcase (vla-get-patternname obj)))   
              )
                   (progn
                     (vla-setPattern obj acHatchPatternTypePreDefined "ANSI31")
                     (vla-put-ScaleFactor obj 12)
              (vla-put-backgroundcolor (list obj *colorobject*))
          )
        )
      )
            )
    )
    (vla-regen doc acallviewports)
    )
)

ronjonp 发表于 2022-7-5 16:07:10

你惹他了?
(= "08_PROPOSED DAtA" (strcase (vla-get-layer obj)))

Tharwat 发表于 2022-7-5 16:09:11

 
不,你搞错我了

K Baden 发表于 2022-7-5 16:16:02

谢谢大家!我试试看它是怎么工作的!我感谢大家的帮助。在它没有真正做任何事情之前,我认为这是因为我的vla put模式名不正确。我假设这就是函数定义,因为你是如何“得到”它的。谢谢我要试一试!
 
另一个快速问题是,例如,如果我想让所有以“\u PLAN”结尾的block将填充比例设置为12,并让所有以“\u ELEV”结尾的块将填充比例设置为60,那么这是否会涉及到围绕已在更新比例的函数的(cond)?

K Baden 发表于 2022-7-5 16:20:14

有人知道如何使其也影响动态块吗?它似乎只在常规块上工作,而现在它并没有改变背景色。
 
经过测试和一点搜索,我还发现我想要的是vla put patternscale,而不是vla put scalefactor。
 
除了添加BG颜色之外,它什么都做,而且只在常规块上工作。
 
这将改变的大部分区块是动态的。有什么想法吗?任何建议都会有帮助!提前谢谢。
 


(defun c:planproposedhatch (/ doc)
(or *colorobject*
   (setq *colorobject*
   (vla-getinterfaceobject
       (vlax-get-acad-object)
       (strcat "AutoCAD.AcCmColor." (substr (getvar "acadver") 1 2))
   )
   )
)
(if
   (null (vl-catch-all-error-p (vl-catch-all-apply 'vla-setrgb (list *colorobject* 255 255 255))))
    (progn (vlax-for blk (vla-get-blocks (setq doc (vla-get-Activedocument (vlax-get-acad-object))))
      (if (= :vlax-false (vla-get-isxref blk))
        (vlax-for obj blk
          (if (and (vlax-write-enabled-p obj)
                        (= "08_Proposed Data" (vla-get-layer obj))
                   (= "AcDbHatch" (vla-get-objectname obj))
                   (= "SOLID" (strcase (vla-get-patternname obj)))   
              )
                   (progn
                     (vla-setPattern obj acHatchPatternTypePreDefined "ANSI31")
                     (vla-put-patternscale obj 12)
              (vla-put-backgroundcolor (list obj *colorobject*))
          )
        )
      )
            )
    )
    (vla-regen doc acallviewports)
    )
)
(vl-load-com)

(princ)
);defun
页: [1] 2
查看完整版本: 参数过多问题