Jump to content

Recommended Posts

Posted

Good morning all!

I am having trouble figuring out how i should properly fix the following code. I am getting too many arguments in the section highlighted, which makes sense to me but im not entirely sure what to do to fix. do i need to add a progn before the changes? Any help would be appreciated!

 

I basically want it to catch all hatch inside blocks that are on that specific layer, and Solid, then change the pattern, scale, and background color of each. I think i have the right process, but I don't think if/and is correct when i have 3 qualifiers. Thanks in advance for any help!

 

(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)

Posted

Hi,

 

If you would like to implement more actions than once with if function then you need to use progn function.

 

[color="blue"](progn[/color]
                   (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*))
[color="blue"])[/color]

Posted

You can also use COND like so:

(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*))
     )
)

Although your test will always fail here:

(= "08_Proposed Data" (strcase (vla-get-layer obj)))

Do you see why?

Posted

Would that fail because of the strcase?

Posted
Would that fail because of the strcase?

 

Bingo!!!!! :)

Posted (edited)
Would that fail because of the strcase?

 

There is no function definition vla-put-patternname besides the other errors that described above, so try the following:

(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)
    )
 )

Edited by Tharwat
Posted

You messing with him? :P

(= "08_PROPOSED DA[color="red"]t[/color]A" (strcase (vla-get-layer obj)))

Posted
You messing with him? :P

(= "08_PROPOSED DA[color="red"]t[/color]A" (strcase (vla-get-layer obj)))

 

No. You got my wrong :lol:

Posted

Thanks everyone! I'll give this a go and see how it works! I appreciate everyone helping out. Before it wasnt really doing anything, and I assume it is because of my incorrect vla-put-patternname. I assumed that would be the function definition simply due to how you "get" it. Thanks!! I will give this a shot!

 

Another quick question would be, if I wanted for example all blokcs that names end in "_PLAN" to have the hatch scale set to 12 and all blocks that end in "_ELEV" to set the hatch scale to 60, would that involve a (cond) surrounding the function that is updating the scale already?

Posted

Does anyone know how to make this affect dynamic blocks as well? It seems to only be working on regular blocks, and right now it isn't changing the background color.

 

After testing and a little searching i also found that vla-put-patternscale is what i wanted rather than vla-put-scalefactor.

 

So its doing everything except adding the BG color, and it's only working on regular blocks.

 

The majority of blocks this will be changing are dynamic. Any ideas? Any advice would help! Thanks in advance.

 


(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

Posted

Are you sure all your hatches are on layer "08_Proposed Data" and all layers are unlocked?

Posted

Hmm. perhaps it is because the hatch within the block would technically be on bylayer, the block itself is on 08_Proposed Data. Perhaps the layer should be specified in the search for a selection of blocks to edit?

Posted (edited)

I have fixed the Background color issue in the newest version of this code below. My only problem left to figure out is why it isnt working on dynamic blocks. Is there a different way to call out hatching that is dynamic within a block?

 

EDIT

You are right, it is because the hatching within the dynamic blocks are set to ByBlock layer, rather than 08_Proposed Data. I'm not understanding why/how this is specifying the layer of the hatch inside the block, rather than the block itself. where would be the spot for the layer qualifier here so that it edits all hatching inside blocks that are on the 08_Proposed Data layer?

 

I suppose from my view it should specify the layer the block is on, then specify the hatch selection within, then specifiy the SOLID hatch selection. It almost seems as though the layer qualifier is affecting the hatch within rather than the block as a whole. Any advice?

 

 

(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)
	      (vl-catch-all-apply 'vla-put-backgroundcolor (list obj *colorobject*))
	    )
	)
      )
            )
    )
    (vla-regen doc acallviewports)
    )
 )
(vl-load-com)

(princ)
);defun

 

EDIT 2

 

I tried this to see if it would capture the layer property for just the blocks and got and activex Server error "unknown name: Layer"

 

(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))))
    [color="red"]  (if (and (= "08_Proposed Data" (vla-get-layer blk))
	  (= :vlax-false (vla-get-isxref blk))
	  )[/color]
	(vlax-for obj blk
	  (if (and (vlax-write-enabled-p obj)
		   (= "AcDbHatch" (vla-get-objectname obj))
		   (= "SOLID" (strcase (vla-get-patternname obj)))   
	      )
                   (progn 
                     (vla-setPattern obj acHatchPatternTypePreDefined "ANSI31")
                     (vla-put-patternscale obj 12)
	      (vl-catch-all-apply 'vla-put-backgroundcolor (list obj *colorobject*))
	    )
	)
      )
            )
    )
    (vla-regen doc acallviewports)
    )
 )
(vl-load-com)

(princ)
);defun

Edited by K Baden

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...