Objetos dentro de bloques
4 participantes
Página 1 de 1.
Objetos dentro de bloques
Buen día señores.
Con problemita que, seguramente ya se resolvió en algún momento, pero no he encontrado referencias. Explico:
Me llegan archivos de topografía con bloques ubicados en sus coordenadas. El bloque consta de un círculo que ubica la posición (X,Y) y unos textos que indican el número de punto, la elevación y el "nombre" el punto: Por ejemplo, está el círculo, un texto amarillo con un texto que indica el número de punto, un texto rojo que indica la elevación del punto, y un texto verde que indica el "nombre" del punto.
En primera instancia lo resolví explotando los bloque y leyendo con esta rutina, "sin problemas"
Espero haber sido claro. Anexo dirección de drive con el DWG y la tutina que hice, espero puedan ayudarme, saludos y gracias.
https://drive.google.com/drive/folders/1Q2X6EQqph-1pI9I6e87te40EG6kwaweh?usp=sharing
Con problemita que, seguramente ya se resolvió en algún momento, pero no he encontrado referencias. Explico:
Me llegan archivos de topografía con bloques ubicados en sus coordenadas. El bloque consta de un círculo que ubica la posición (X,Y) y unos textos que indican el número de punto, la elevación y el "nombre" el punto: Por ejemplo, está el círculo, un texto amarillo con un texto que indica el número de punto, un texto rojo que indica la elevación del punto, y un texto verde que indica el "nombre" del punto.
En primera instancia lo resolví explotando los bloque y leyendo con esta rutina, "sin problemas"
- Código:
(vl-load-com)
(defun c:pasaptos()
(vl-cmdf "_Zoom" "_extents")
(setq nombre(getvar "dwgname")
ruta(getvar "dwgprefix"))
(setq archivo(strcat ruta nombre ".CSV"))
(setq i 0)
(setq conj(ssget "_X"(list '(0 . "circle")'(8 . "V-NODE"))))
(setq cuantos(sslength conj))
(repeat cuantos
(setq ent(ssname conj i))
(setq obj(vlax-ename->vla-object ent))
(setq zc(vlax-get-property obj 'center))
(setq centro(vlax-safearray->list(vlax-variant-value zc)))
(setq xx(car centro) yy(cadr centro))
(setq pto2(polar centro(* pi 0.0)0.75))
(setq pto3(polar centro(* pi 1.8)0.75))
(setq rojo(ssget "_F" (list centro pto2) (list(cons 0 "*text")(cons 62 1))))
(setq ent(ssname rojo 0))
(setq obj(vlax-ename->vla-object ent))
(setq eleva(distof(vlax-get-property obj 'textstring)))
(setq p1(list xx yy eleva))
(setq verde(ssget "_F"(list centro pto3)(list(cons 0 "text")(cons 62 3))))
(setq ent(ssname verde 0))
(setq obj(vlax-ename->vla-object ent))
(setq capa(strcat "+"(vlax-get-property obj 'textstring)))
(ENTMAKE (LIST '(0 . "POINT")'(100 . "AcDbEntity")'(100 . "AcDbPoint")(CONS 10 p1)(cons 8 capa)))
(setq renglon(strcat (rtos xx 2 3)","(rtos yy 2 3)","(rtos eleva 2 3)","capa))
(Setq abre(open archivo "a"))
(write-line renglon abre)
(close abre)
(setq i (+ 1 i))
)
(startapp "notepad" archivo)
)
Espero haber sido claro. Anexo dirección de drive con el DWG y la tutina que hice, espero puedan ayudarme, saludos y gracias.
https://drive.google.com/drive/folders/1Q2X6EQqph-1pI9I6e87te40EG6kwaweh?usp=sharing
eliasp- Mensajes : 225
Fecha de inscripción : 17/03/2016
Re: Objetos dentro de bloques
Podrías usar dattaextraction y seleccionar los bloques, eso te dará toda la información contenida en ellos
bernie67- Mensajes : 98
Fecha de inscripción : 22/03/2016
Edad : 57
Localización : Bogota DC-Colombia
Re: Objetos dentro de bloques
; Crea un fichero.txt con todas las ubicaciones de los bloques del dibujo.
;;; Program by Tony Hotchkiss
(defun err (s)
(if (= s "Function cancelled")
(princ "\nBLOCK-LOC - cancelled: ")
(progn (princ "\nBLOCK-LOC - Error: ") (princ s) (terpri))
)
(resetting)
(princ "SYSTEM VARIABLES have been reset\n")
(princ)
)
(defun setv (systvar newval)
(setq x (read (strcat systvar "1")))
(set x (getvar systvar))
(setvar systvar newval)
)
(defun setting ()
(setq oerr *error*)
(setq *error* err)
(setv "CMDECHO" 0)
(setv "BLIPMODE" 0)
)
(defun rsetv (systvar)
(setq x (read (strcat systvar "1")))
(setvar systvar (eval x))
)
(defun resetting () (rsetv "CMDECHO") (rsetv "BLIPMODE") (setq *error* oerr))
(defun dxf (code ename) (cdr (assoc code (entget ename))))
(defun bloc-loc (/ i)
(setq blist (get-blist)
i (- 1)
)
(setq fname (getfiled "Results file" "" "txt" 1))
(setq f1 (open fname "w"))
(write-line "UBICACION de BLOQUES, X-Y-Z COORDENADAS" f1)
(repeat (length blist)
(setq bname (nth (setq i (1+ i)) blist))
(setq ss (ssget "X"
(list '(0 . "INSERT") (cons 2 bname))
)
)
(setq ptlist (extract-block-locations ss))
(write-line bname f1)
(foreach item ptlist
(setq x (rtos (nth 0 item) 2 2)
y (rtos (nth 1 item) 2 2)
z (rtos (nth 2 item) 2 2)
str (strcat x " " y " " z)
)
(write-line str f1)
)
(write-line "" f1)
)
(setq f1 (close f1))
(princ)
)
(defun get-blist (/ i)
(setq ss (ssget "X" '((0 . "INSERT"))))
(if ss
(progn (setq i (- 1)
blist nil
)
(repeat (sslength ss)
(setq en (ssname ss (setq i (1+ i)))
blkname (dxf 2 en)
)
(if (not (member blkname blist))
(setq blist (append blist (list blkname)))
)
)
)
(progn (alert "No block references found.") (exit))
)
(setq blist (vl-sort blist '<))
)
(defun extract-block-locations (ss / i)
(setq i (- 1)
inspt-list nil
)
(repeat (sslength ss)
(setq en (ssname ss (setq i (1+ i)))
inspt (dxf 10 en)
inspt-list (append inspt-list (list inspt))
)
)
inspt-list
)
(defun c:blc () (setting) (bloc-loc) (resetting) (princ))
;;; Program by Tony Hotchkiss
(defun err (s)
(if (= s "Function cancelled")
(princ "\nBLOCK-LOC - cancelled: ")
(progn (princ "\nBLOCK-LOC - Error: ") (princ s) (terpri))
)
(resetting)
(princ "SYSTEM VARIABLES have been reset\n")
(princ)
)
(defun setv (systvar newval)
(setq x (read (strcat systvar "1")))
(set x (getvar systvar))
(setvar systvar newval)
)
(defun setting ()
(setq oerr *error*)
(setq *error* err)
(setv "CMDECHO" 0)
(setv "BLIPMODE" 0)
)
(defun rsetv (systvar)
(setq x (read (strcat systvar "1")))
(setvar systvar (eval x))
)
(defun resetting () (rsetv "CMDECHO") (rsetv "BLIPMODE") (setq *error* oerr))
(defun dxf (code ename) (cdr (assoc code (entget ename))))
(defun bloc-loc (/ i)
(setq blist (get-blist)
i (- 1)
)
(setq fname (getfiled "Results file" "" "txt" 1))
(setq f1 (open fname "w"))
(write-line "UBICACION de BLOQUES, X-Y-Z COORDENADAS" f1)
(repeat (length blist)
(setq bname (nth (setq i (1+ i)) blist))
(setq ss (ssget "X"
(list '(0 . "INSERT") (cons 2 bname))
)
)
(setq ptlist (extract-block-locations ss))
(write-line bname f1)
(foreach item ptlist
(setq x (rtos (nth 0 item) 2 2)
y (rtos (nth 1 item) 2 2)
z (rtos (nth 2 item) 2 2)
str (strcat x " " y " " z)
)
(write-line str f1)
)
(write-line "" f1)
)
(setq f1 (close f1))
(princ)
)
(defun get-blist (/ i)
(setq ss (ssget "X" '((0 . "INSERT"))))
(if ss
(progn (setq i (- 1)
blist nil
)
(repeat (sslength ss)
(setq en (ssname ss (setq i (1+ i)))
blkname (dxf 2 en)
)
(if (not (member blkname blist))
(setq blist (append blist (list blkname)))
)
)
)
(progn (alert "No block references found.") (exit))
)
(setq blist (vl-sort blist '<))
)
(defun extract-block-locations (ss / i)
(setq i (- 1)
inspt-list nil
)
(repeat (sslength ss)
(setq en (ssname ss (setq i (1+ i)))
inspt (dxf 10 en)
inspt-list (append inspt-list (list inspt))
)
)
inspt-list
)
(defun c:blc () (setting) (bloc-loc) (resetting) (princ))
bernie67- Mensajes : 98
Fecha de inscripción : 22/03/2016
Edad : 57
Localización : Bogota DC-Colombia
Re: Objetos dentro de bloques
Pues nada, creo que las opciones que te di son para bloques normales o con atributos
bernie67- Mensajes : 98
Fecha de inscripción : 22/03/2016
Edad : 57
Localización : Bogota DC-Colombia
Re: Objetos dentro de bloques
Muchas gracias. Ahora si que, la intención es lo que cuenta. Por lo pronto lo resolví de forma "un tanto artesanal" pero funciona. Explico: Tome cada bloque, lo exploté y leí cada elemento y luego borré cada elemento explotado y así con cada bloc, lo malo es que normalmente son 2 o 3 mil puntos, pero mejor eso que a mano.
Como digo, está artesanal, la coloco por si a laguien le sirve o le interesa el tema o si lo pueden mejorar, bienvenido.
Otra vez Gracias
Como digo, está artesanal, la coloco por si a laguien le sirve o le interesa el tema o si lo pueden mejorar, bienvenido.
Otra vez Gracias
- Código:
(vl-load-com)
(defun c:prueba2()
(setq i 0)
(setvar 'pdmode 35)
(vl-cmdf "_Zoom" "_extents")
(setq nombre(getvar "dwgname")
ruta(getvar "dwgprefix"))
(setq archivo(strcat ruta nombre ".CSV"))
(setq conj(ssget "_X" (list (cons 0 "INSERT"))))
(setq cuantos(sslength conj))
(repeat cuantos
(setq ent(ssname conj i))
(setq obj(vlax-ename->vla-object ent))
(setq pto0(vlax-get-property obj 'insertionpoint))
(setq pto1(vlax-safearray->list(vlax-variant-value pto0)))
(setq pto2(polar pto1(* pi 0.6)0.23)
pto3(polar pto1(* pi 1.91)0.7))
;(vl-cmdf "_rectangle" pto2 pto3)
(vlax-invoke-method obj 'explode)
;---
(setq circ(ssget "_X"(list '(0 . "circle")'(8 . "V-NODE"))))
(setq ent(ssname circ 0))
(setq obj(vlax-ename->vla-object ent))
(setq zc(vlax-get-property obj 'center))
(setq centro(vlax-safearray->list(vlax-variant-value zc)))
(setq xx(car centro) yy(cadr centro))
;---
(setq pto4(polar centro(* pi 0.0)0.75))
(setq pto5(polar centro(* pi 1.8)0.75))
(setq con1(ssget "_X"(list (cons 0 "*text"))));(cons 62 1))))
(setq paso 0)
(repeat(sslength con1)
(setq ent(ssname con1 paso))
(vl-cmdf "_explode" ent)
(setq paso(+ paso 1))
)
(setq rojo(ssget "_X"(list (cons 0 "text")(cons 62 1))))
(setq ent(ssname rojo 0))
(setq obj(vlax-ename->vla-object ent))
(setq eleva(distof(vlax-get-property obj 'textstring)))
(setq p1(list xx yy eleva))
;---
(setq verde(ssget "_X"(list (cons 0 "text")(cons 62 3))))
(setq ent(ssname verde 0))
(setq obj(vlax-ename->vla-object ent))
(setq capa(strcat "+"(vlax-get-property obj 'textstring)))
(ENTMAKE (LIST '(0 . "POINT")'(100 . "AcDbEntity")'(100 . "AcDbPoint")(CONS 10 p1)(cons 8 capa)))
(setq renglon(strcat (rtos xx 2 3)","(rtos yy 2 3)","(rtos eleva 2 3)","capa))
(Setq abre(open archivo "a"))
(write-line renglon abre)
(close abre)
;---
(setq borra(ssget "_X" (list '(0 . "circle,line,text"))))
(vl-cmdf "_erase" borra "")
(setq i(1+ i))
)
(startapp "notepad" archivo)
)
eliasp- Mensajes : 225
Fecha de inscripción : 17/03/2016
Re: Objetos dentro de bloques
También podrías pedir que te envíen las tablas con la información e insertarla con varias rutinas que existen. Los bloques con atributos son la solución
bernie67- Mensajes : 98
Fecha de inscripción : 22/03/2016
Edad : 57
Localización : Bogota DC-Colombia
Re: Objetos dentro de bloques
Esta función te permite obtener una lista de todos los elementos que componen un bloque. Creo que es lo que necesitas
- Código:
(defun foo (your_vla_block / rtn);BY Jonathan Handojo
(vlax-for x (vla-item (vla-get-blocks (vla-get-document your_vla_block)) (vla-get-effectivename your_vla_block))
(setq rtn (cons x rtn));lista vla_obj
)
(reverse rtn)
)
Re: Objetos dentro de bloques
- Código:
(vl-load-com)
(defun c:ExportPointsToSCV ( / Datos archivo file separador
;|funtions|; GetDatosBloques jlgg-Delete-Object jlgg-Explode_Obj jlgg-GetVLA-Obj *error*
)
;;___________________________________________________________________________________
(defun GetDatosBloques ( / filter ssBlk lstss ListaDatos)
;;Selección de bloques anonimos
(setq filter '((0 . "INSERT") (2 . "`**" )))
(prompt "\nSeleccione entidades: ")
(cond
((not (setq ssBlk (ssget "_X" filter)));"_X"
(prompt "\nNingún bloque sin nombre seleccionado.")
)
(T
(setq lstss (vl-remove-if 'listp (mapcar 'cadr (ssnamex ssBlk))))
(mapcar
(function
(lambda (blk / oBlk tmpObjList PtIns x1 y1 lstTMP)
(setq oBlk (jlgg-GetVLA-Obj blk))
(setq PtIns (vlax-safearray->list (vlax-variant-value (vla-Get-InsertionPoint oBlk))))
(setq x1 (car PtIns) y1 (cadr PtIns))
(cond
((setq tmpObjList (jlgg-Explode_Obj oBlk))
(setq lstTMP nil)
(mapcar
(function
(lambda (Obj / centro x y Text col val)
(cond
((and (equal (vla-get-ObjectName Obj) "AcDbCircle")
(equal (vla-get-Layer Obj) "V-NODE"))
(setq centro (vlax-safearray->list (vlax-variant-value (vla-Get-Center Obj))))
(setq x (car centro) y (cadr centro))
(setq lstTMP (cons (list "circle" x y) lstTMP))
)
((and (equal (vla-get-ObjectName Obj) "AcDbMText")
(equal (vla-get-Layer Obj) "V-NODE-TEXT"))
(setq Text (vla-Get-TextString Obj))
(setq col (substr Text 4 1))
(setq val (substr Text 6 (strlen Text))
val (substr val 1 (1- (strlen val))))
(cond
((equal col "1");|Rojo|; (setq lstTMP (cons (list "eleva" (distof val)) lstTMP)))
((equal col "2");|Amarillo|; (setq lstTMP (cons (list "num" (atoi val)) lstTMP)))
((equal col "3");|Verde|; (setq lstTMP (cons (list "capa" (strcat "+" val)) lstTMP)))
);c.cond
)
);c.cond
)
)
tmpObjList
);c.mapcar
(mapcar (function jlgg-Delete-Object) tmpObjList)
);tmpObjList
);c.cond
(if lstTMP
(setq lstTMP (cons (list "PtIns" x1 y1) lstTMP)
ListaDatos (cons lstTMP ListaDatos))
);c.if
)
)
lstss
);c.mapcar
);T
);c.cond
ListaDatos
);c.defun
;;--------------------------------------------------------------------------
(defun jlgg-Delete-Object (obj / del)
(if (vl-catch-all-error-p
(setq Del (vl-catch-all-apply
(function vla-delete)
(list (jlgg-GetVLA-Obj obj)))))
nil
t)
)
;;-------------------------------------------------------------------
(defun jlgg-Explode_Obj (ObjEnt / OBJs_Explode OBJs_Explode listObjects)
(setq ObjEnt (jlgg-GetVLA-Obj ObjEnt))
(if (vlax-method-applicable-p ObjEnt 'explode)
(if (null (vl-catch-all-error-p
(setq OBJs_Explode
(vl-catch-all-apply 'vla-explode (list ObjEnt))
)
)
)
(setq listObjects (vlax-safearray->list (vlax-variant-value OBJs_Explode)))
) ;c.if
) ;c.if
listObjects
)
;;_______________________________________________________________________________
(defun jlgg-GetVLA-Obj (Entity /)
(cond
((= (Type Entity) 'ENAME) (vlax-ename->vla-object Entity))
((= (Type Entity) 'VLA-OBJECT) Entity)
(T nil)
)
)
;;;____________________________________________________________________________
(defun *error* (msg)
;(while (/= (getvar "CMDNAMES") "") (command)) ;;cancelar todo lo activo
;;; (if (= 8 (logand 8 (getvar "UNDOCTL"))) ;;undos colgados (no testados)
;;; (progn
;;; (command-s "_.UNDO" "_e")
;;; (command-s "_u")
;;; )
;;; );c.if
(if (and msg (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*,interrup*")))
(princ (strcat "\nExportPointsToSCV Error: " msg))
)
(if tmpObjList (mapcar (function jlgg-Delete-Object) tmpObjList))
(princ)
);c defun
;;---------------------------- MAIN ---------------------------------------
(setq filetype "csv") ;;"txt" "csv"
(setq separador (if (= filetype "csv") ";" ","))
(cond
((setq Datos (GetDatosBloques))
(setq Datos (vl-sort Datos (function (lambda (e1 e2) (< (cadr (assoc "num" e1)) (cadr (assoc "num" e2)) ) )) ))
(setq archivo(strcat (getvar 'dwgprefix) (vl-string-right-trim ".dwg" (getvar 'dwgname)) "." filetype))
(Setq file (open archivo "w"))
(if (= filetype "csv") (write-line (strcat "sep =" separador) file))
(mapcar
(function
(lambda (dato / LineTxt num eleva capa PtIns circle x y)
(setq num (cadr (assoc "num" dato))
capa (cadr (assoc "capa" dato))
eleva (cadr (assoc "eleva" dato))
PtIns (cdr (assoc "PtIns" dato))
circle (cadr (assoc "circle" dato)))
(setq x (car PtIns) y (cadr PtIns))
(setq LineTxt (strcat (itoa num) separador (rtos x 2 3) separador (rtos y 2 3) separador (rtos eleva 2 3) ";" capa))
(write-line LineTxt file)
)
)
Datos
)
(close file)
(command "shell" (strcat "start " archivo))
)
)
(princ)
);c.defun
(princ)
nikitonipongo- Mensajes : 4
Fecha de inscripción : 08/02/2017
A robierzo le gusta esta publicaciòn
Temas similares
» Vincular Bloques
» SELECCION DE OBJETOS
» Seleccion Bloques Intersectados
» OBJETOS SOLIDOS DUPLICADOS
» Seleccionar ultimos objetos
» SELECCION DE OBJETOS
» Seleccion Bloques Intersectados
» OBJETOS SOLIDOS DUPLICADOS
» Seleccionar ultimos objetos
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.