Lisp to create Area with Field creating New Object or selecting Existing Object

Lisp to create Area with Field creating New Object or selecting Existing Object

Gustavo_Bernardi
Contributor Contributor
1,335 Views
2 Replies
Message 1 of 3

Lisp to create Area with Field creating New Object or selecting Existing Object

Gustavo_Bernardi
Contributor
Contributor

I'm tring to modify a lisp. Actually it needs a selection (1 object by picbox) with vlax-get-acad-object.

I want catch Automatically the entlast object if the chosen method is Rectang, or Pline, or Boundary

About the code, is to create a text with field associated to object area, using the area conversion based in the units of file (results always in m²)

 

Look in the code:
---------> If option is R i want make rectang
---------> if option is P i want make polyline
If I draw a object (Pline, Rectang or boundary) I want select automatically this object to continue with the routine below

 

(defun c:AREAFIELD (/ Get-ObjectIDx64 space ss pt) (unidadesporfavor) (setq actualunits (getvar "LUNITS")) (setq actualprec(getvar "LUPREC")) (setvar "LUNITS" 2) (setvar "LUPREC" 8) (converterparametrosquadradosporfavor) (setq scalestring (rtos fatormetroquadrado)) (setvar "LUNITS" actualunits)(setvar "LUPREC" actualprec) (if (= prefixarea nil)(setq prefixarea "A: ")) (if (= prefixopiso nil)(setq prefixopiso "P: ")) (if (= desecomp nil)(setq desecomp "Sim")) (if (= desepiso nil)(setq desepiso "Sim")) (if (= metodoarea nil)(setq metodoarea "Objeto")) (setq keyfrase(strcat "\nOpções[Objeto/Retangular /PoLyline/Boundary / Prefixo de área=" prefixarea " /PRefixo de piso=" prefixopiso "/Escrever piso=" desepiso "/EScrever compartimento=" desecomp "/ Unidades: "unidades"]<" metodoarea ">")) (initget "O R PL B X P PR E ES U" 0) (setq keyopt(getkword keyfrase)) (cond ( (= keyopt "P") (Setq prefixarea (getstring T "\Prefixo de área: ")) (c:AREAFIELD) ) ( (= keyopt "PR") (Setq prefixopiso (getstring T "\Prefixo de piso: ")) (c:AREAFIELD) ) ((= keyopt "U")(command "._DDUNITS" )(c:areafield)) ( (= keyopt "E") (if (= desepiso "Sim")(setq desepiso "Não")(setq desepiso "Sim")) (c:AREAFIELD) ) ( (= keyopt "ES") (if (= desecomp "Sim")(setq desecomp "Não")(setq desecomp "Sim")) (c:AREAFIELD) ) ) (if (= desecomp "Sim") (progn (initget "S SA C Q D SU B BA L LA CI H AL G V SAC ES SAL E" 128) (setq COMP(getstring T "\nCompartimento:[Sala / SAla de estar / Cozinha / Quarto / Dormitório / SUíte / Banho / BAnheiro / Lavabo / LAvanderia / CIrculação / Hall / ALpendre / Garagem / Varanda / SACada / EScritório / SALa de jantar / Estar íntimo / ]<...> ")) (cond ((= comp "S")(SETQ COMPARTIMENTO (strcat "Sala"))) ((= comp "SA")(SETQ COMPARTIMENTO (strcat "Sala de Estar"))) ((= comp "C")(SETQ COMPARTIMENTO (strcat "Cozinha"))) ((= comp "Q")(SETQ COMPARTIMENTO (strcat "Quarto"))) ((= comp "D")(SETQ COMPARTIMENTO (strcat "Dormitório"))) ((= comp "SU")(SETQ COMPARTIMENTO (strcat "Suíte"))) ((= comp "B")(SETQ COMPARTIMENTO (strcat "Banho"))) ((= comp "BA")(SETQ COMPARTIMENTO (strcat "Banheiro"))) ((= comp "L")(SETQ COMPARTIMENTO (strcat "Lavabo"))) ((= comp "LA")(SETQ COMPARTIMENTO (strcat "Lavanderia"))) ((= comp "CI")(SETQ COMPARTIMENTO (strcat "Circulação"))) ((= comp "H")(SETQ COMPARTIMENTO (strcat "Hall"))) ((= comp "A")(SETQ COMPARTIMENTO (strcat "Alpendre"))) ((= comp "G")(SETQ COMPARTIMENTO (strcat "Garagem"))) ((= comp "V")(SETQ COMPARTIMENTO (strcat "Varanda"))) ((= comp "SAC")(SETQ COMPARTIMENTO (strcat "Sacada"))) ((= comp "ES")(SETQ COMPARTIMENTO (strcat "Escritório"))) ((= comp "SAL")(SETQ COMPARTIMENTO (strcat "Sala de Jantar"))) ((= comp "E")(SETQ COMPARTIMENTO (strcat "Estar Íntimo"))) ((= (type COMP) 'STR)(setq compartimento comp)) ) ) ) (if (= desepiso "Sim") (progn (initget "N T PA TA LA C PO B BA PED CI CIM TI CO" 128) (setq TPISO(getstring T "\nPiso:[... / Tabuão / PArquê / TAcos / LAminado / Cerâmico / POrcelanato / Basalto regular / BAsalto irregular / PEDra portuguesa / CImento alisado / CIMento queimado / TIjolo / COncreto intertravado]<...>")) (cond ((= TPISO "T")(SETQ PISO (strcat "Tabuão"))) ((= TPISO "PA")(SETQ PISO (strcat "Parquê"))) ((= TPISO "TA")(SETQ PISO(strcat "Tacos"))) ((= TPISO "LA")(SETQ PISO(strcat "Piso Laminado"))) ((= TPISO "C")(SETQ PISO(strcat "Piso Cerâmico"))) ((= TPISO "PO")(SETQ PISO(strcat "Porcelanato"))) ((= TPISO "B")(SETQ PISO(strcat "Basalto Regular"))) ((= TPISO "BA")(SETQ PISO(strcat "Basalto Irregular"))) ((= TPISO "PED")(SETQ PISO(strcat "Pedra Portuguesa"))) ((= TPISO "CI")(SETQ PISO(strcat "Cimento Alisado"))) ((= TPISO "CIM")(SETQ PISO(strcat "Cimento Queimado"))) ((= TPISO "TI")(SETQ PISO(strcat "Tijolo"))) ((= TPISO "CO")(SETQ PISO(strcat "Concreto Intertravado"))) ((= (type TPISO) 'STR)(setq PISO TPISO)) ) ) ) (cond ( (= keyopt "R");;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;---------> If option is R i want make rectang (command "._RECTANG" pause pause) ) ( (= keyopt "P");;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;---------> if option is P i want make polyline (command "._pline") (while (wcmatch (getvar "cmdnames") "*PLINE*") (command pause) ) ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; If I draw a object (Pline, Rectang or boundary) I want select automatically this object to continue with the routine below (defun Get-ObjectIDx64 (obj / util) (setq util (vla-get-Utility (vla-get-activedocument (vlax-get-acad-object)))) (if (> (vl-string-search "x64" (getvar "platform")) 0) (vlax-invoke-method util "GetObjectIdString" obj :vlax-False) (itoa (vla-get-Objectid obj)) ) ) (setq space (vla-get-modelspace (vla-get-ActiveDocument (vlax-get-acad-object)) ) ) (if (and (setq ss (car (entsel "\n Select Object for Area : "))) (setq pt (getpoint "\n Specify Text Location :")) (setq PT (trans pt 1 0)) ) (cond ( (and (= desecomp "Sim")(= desepiso "Sim")) (vla-addMText space (vlax-3d-point pt)1.(strcat COMPARTIMENTO "\\P" PREFIXAREA "%<\\AcObjProp Object(%<\\_ObjId "(Get-ObjectIDx64 (vlax-ename->vla-object ss))">%).Area \\f \"%lu2%pr2%ps[, m²]%ct8["scalestring"]\">%" "\\P" PREFIXOPISO PISO)) ) ( (= desecomp "Sim") (vla-addMText space (vlax-3d-point pt)1.(strcat COMPARTIMENTO "\\P" PREFIXAREA "%<\\AcObjProp Object(%<\\_ObjId "(Get-ObjectIDx64 (vlax-ename->vla-object ss))">%).Area \\f \"%lu2%pr2%ps[, m²]%ct8["scalestring"]\">%")) ) ( (= desepiso "Sim") (vla-addMText space (vlax-3d-point pt)1.(strcat "\\P" PREFIXAREA "%<\\AcObjProp Object(%<\\_ObjId "(Get-ObjectIDx64 (vlax-ename->vla-object ss))">%).Area \\f \"%lu2%pr2%ps[, m²]%ct8["scalestring"]\">%" "\\P" PREFIXOPISO PISO)) ) ( (vla-addMText space (vlax-3d-point pt)1.(strcat "\\P" PREFIXAREA "%<\\AcObjProp Object(%<\\_ObjId "(Get-ObjectIDx64 (vlax-ename->vla-object ss))">%).Area \\f \"%lu2%pr2%ps[, m²]%ct8["scalestring"]\">%")) ) ) ) (command "_.justifytext" (entlast) "" "mc") )

(defun unidadesporfavor()
(setq unitscode (getvar "insunits"))
(cond
((= unitscode 0)(setq unidades "não definida"))
((= unitscode 1)(setq unidades "polegadas"))
((= unitscode 2)(setq unidades "pés"))
((= unitscode 3)(setq unidades "milhas"))
((= unitscode 4)(setq unidades "milímetros"))
((= unitscode 5)(setq unidades "centímetros"))
((= unitscode 6)(setq unidades "metros"))
((= unitscode 7)(setq unidades "quilômetros"))
((= unitscode 8)(setq unidades "micropolegadas"))
((= unitscode 9)(setq unidades "mils"))
((= unitscode 10)(setq unidades "jardas"))
((= unitscode 11)(setq unidades "angstrom"))
((= unitscode 12)(setq unidades "nanômetros"))
((= unitscode 13)(setq unidades "micrômetro"))
((= unitscode 14)(setq unidades "decímetros"))
((= unitscode 15)(setq unidades "decâmetros"))
((= unitscode 16)(setq unidades "hectômetros"))
((= unitscode 17)(setq unidades "gigametros"))
((= unitscode 18)(setq unidades "unidades astronômicas"))
((= unitscode 19)(setq unidades "anos luz"))
((= unitscode 20)(setq unidades "parsecs"))
)
)

(defun converterunidadesporfavor()
(setq unitscode (getvar "insunits"))
(cond
((= unitscode 0)(setq scalefactorunits 1.0))
((= unitscode 1)(setq scalefactorunits 25.4))
((= unitscode 2)(setq scalefactorunits 304.8))
((= unitscode 3)(setq scalefactorunits 1609344))
((= unitscode 4)(setq scalefactorunits 1.0))
((= unitscode 5)(setq scalefactorunits 10.0))
((= unitscode 6)(setq scalefactorunits 1000.0))
((= unitscode 7)(setq scalefactorunits 1000000.0))
((= unitscode 8)(setq scalefactorunits 0.0000254))
((= unitscode 9)(setq scalefactorunits 0.0254))
((= unitscode 10)(setq scalefactorunits 9144.0))
((= unitscode 11)(setq scalefactorunits 0.0000001))
((= unitscode 12)(setq scalefactorunits 0.000000001))
((= unitscode 13)(setq scalefactorunits 0.001))
((= unitscode 14)(setq scalefactorunits 100.0))
((= unitscode 15)(setq scalefactorunits 10000.0))
((= unitscode 16)(setq scalefactorunits 100000.0))
((= unitscode 17)(setq scalefactorunits 1000000000))
((= unitscode 18)(setq scalefactorunits 149597870700000))
((= unitscode 19)(setq scalefactorunits 9460730472580800000))
((= unitscode 20)(setq scalefactorunits 30856778200000000000))
)
)
(defun converterparametrosquadradosporfavor()
(converterunidadesporfavor)
(setq fatormetroquadrado (*(/ scalefactorunits 1000) (/ scalefactorunits 1000)))
)

 

TIA

0 Likes
1,336 Views
2 Replies
Replies (2)
Message 2 of 3

CADaSchtroumpf
Advisor
Advisor

Please next time, indent your code...

 

Change

	(setq keyopt(getkword keyfrase))
	(cond
		( (= keyopt "P")
			(Setq prefixarea (getstring T "\Prefixo de área: "))
			(c:AREAFIELD)
		)
		( (= keyopt "PR")
			(Setq prefixopiso (getstring T "\Prefixo de piso: "))
			(c:AREAFIELD)
		)
		((= keyopt "U")(command "._DDUNITS" )(c:areafield))
		( (= keyopt "E")
			(if (= desepiso "Sim")(setq desepiso "Não")(setq desepiso "Sim"))
			(c:AREAFIELD)
		)
		( (= keyopt "ES")
		(if (= desecomp "Sim")(setq desecomp "Não")(setq desecomp "Sim"))
		(c:AREAFIELD)
		)
	)

to:

	(setq keyopt(getkword keyfrase))
	(cond
		( (= keyopt "R")
			(command "._RECTANG" pause pause)
		)
		( (= keyopt "P")
			(command "._pline")
			(while (not (zerop (getvar "cmdactive")))
				(command pause)
			)
		)
		( (= keyopt "P")
			(Setq prefixarea (getstring T "\Prefixo de área: "))
			(c:AREAFIELD)
		)
		( (= keyopt "PR")
			(Setq prefixopiso (getstring T "\Prefixo de piso: "))
			(c:AREAFIELD)
		)
		((= keyopt "U")(command "._DDUNITS" )(c:areafield))
		( (= keyopt "E")
			(if (= desepiso "Sim")(setq desepiso "Não")(setq desepiso "Sim"))
			(c:AREAFIELD)
		)
		( (= keyopt "ES")
		(if (= desecomp "Sim")(setq desecomp "Não")(setq desecomp "Sim"))
		(c:AREAFIELD)
		)
	)

and change

		(and
			(setq ss (car (entsel "\n Select Object for Area : ")))
			(setq pt (getpoint "\n Specify Text Location :"))
			(setq PT (trans pt 1 0))
		)

to

		(and
			(setq ss (if (or (eq keyopt "R") (eq keyopt "P")) (entlast) (car (entsel "\n Select Object for Area : "))))
			(setq pt (getpoint "\n Specify Text Location :"))
			(setq PT (trans pt 1 0))
		)
0 Likes
Message 3 of 3

paullimapa
Mentor
Mentor

Maybe you shoud try my free Area Object Link (AOL) app which can be downloaded from the Exchange Store. 

 

 

 

Area Object Link | Attribute Modifier | Dwg Setup | Feet-Inch Calculator
Layer Apps | List on Steroids | VP Zoom Scales |Exchange App Store


Paul Li
IT Specialist
@The Office
Apps & Publications | Video Demos
0 Likes