Crear Layouts de forma automática desde el Model en AutoCAD

Crear Layouts de forma automática desde el Model en AutoCAD

roherad916
Participant Participant
2.783 Vistas
6 Respuestas
Mensaje 1 de 7

Crear Layouts de forma automática desde el Model en AutoCAD

roherad916
Participant
Participant

Buenas a todos,

 

Estoy intentando modificar el siguiente rutina para adaptarla a mi flujo de trabajo. Esta rutina encuentra bloques en el Model y los pasa al Layout de manera de hacer las presentaciones de forma automática.

 

Dejo el enlace original:

https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/how-to-create-automatic-layouts/m-p/...

 

Esta rutina se creó para para una presentación que requería 2 viewports, uno del bloque en cuestión y otro con una vista mas alejada donde permitía ajustar el factor de escala.

 

Lo que necesito hacer es quitar la función del segundo viewport que no me interesa y cambiar la función de NO_OF_SHEETS por NEXT_SHEET es decir que en lugar de colocar el total de páginas coloque el nombre de la página siguiente que la toma del atributo MAPSHTNUM

 

Mis bloques van a estar siempre alineados en el eje X y espaciados una distancia fija por lo que el orden no depende del número de las páginas, que a veces pueden tener sufijos, sino que depende de la posición en el eje X.

 

(defun GridsToLayouts ( UseUndoMarks / GridLayer GridAttribute SourceLayout TitleBlockHeight KeyZoomFactor
                                       TitleBlockName TitleBlockSheetNumberAttribute TitleBlockTotalSheetsAttribute
                                       vl-GetAttributeValue
                                       ss i enam edata grids grid id previd ssvp1 vp1 vpno1 ssvp2 vp2 vbno2 ptmin ptmax)
  (vl-load-com)

  ;;;*SOME SETTINGS THAT CAN BE CUSTOMIZED
  (setq GridLayer                        "GRID") ;; Nombre de la capa de los bloques de la ventana gráfica (necesario)
  (setq GridAttribute                    "MAPSHTNUM") ;; Nombre del atributo de los bloques anteriores que indican el numero de pagina (necesario)
  (setq SourceLayout                     "REF") ;; nombre de la presentacion que se usa de plantilla (necesario)
  (setq TitleBlockHeight                 86) ;; Altura del cajetin
  (setq KeyZoomFactor                    0.5)
  ;(setq TitleBlockName                   "XXX_2") ;; nombre del bloque del cajetin
  ;(setq TitleBlockSheetNumberAttribute   "SHEET_NO") ;; nombre del identificador del numero de paginas
  ;(setq TitleBlockTotalSheetsAttribute   "NO_OF_SHEETS") ;; nombre del identificador del numero total de paginas

  (defun vl-GetAttributeValue ( blk tag )
    (setq tag (strcase tag))
    (vl-some '(lambda ( att ) (if (= tag (strcase (vla-get-tagstring att))) (vla-get-textstring att)))
        (vlax-invoke blk 'getattributes)
    )
  )
 
  (cond
   ((not (setq ss (ssget "x" (list (cons 0 "INSERT") (cons 8 GridLayer)))))
    (princ (strcat "\nNo grid blocks on layer '" GridLayer "' found."))
   )
   ((not (member SourceLayout (layoutlist)))
    (princ (strcat "\nSource layout '" SourceLayout "' not found."))
   )
   ((> (length (layoutlist)) 1)
    (princ (strcat "\nOnly layouts 'Model' and '" SourceLayout "' should exist."))
   )
   (T
    (setq i 0)
    (while (< i (sslength ss))
	  (setq edata (entget (setq enam (ssname ss i))))
      (if (and
            (= (cdr (assoc 0 edata)) "INSERT")
            (setq attval (vl-GetAttributeValue (vlax-ename->vla-object (cdr (assoc -1 edata))) GridAttribute))
          )
        (setq grids (cons (cons attval enam) grids))
      )
      (setq i (1+ i))
    )
    (setq grids (vl-sort grids (function (lambda (e1 e2) (< (car e1) (car e2))))))

    
    (if UseUndoMarks (vla-StartUndoMark (vla-get-ActiveDocument (vlax-get-acad-object))))
    (if grids
      (princ "\nCreating layouts...")
      (princ "\nNo grids found...")
    )
    (foreach grid grids
      (if grids
        (progn
          (setq id (car grid) enam (cdr grid))
          (princ (strcat "\nCreating layout '" id "'... "))
          (if (not (member id (layoutlist)))
            (command "._layout" "c" previd id)
          )
          (command "._layout" "d" id "._pspace")
          (if (and
                (setq ssvp1 (ssget "x" (list (cons 0 "VIEWPORT") (cons -4 "*,>,*") (list 10 0 TitleBlockHeight 0))))
                (setq ssvp2 (ssget "x" (list (cons 0 "VIEWPORT") (cons -4 "*,<,*") (list 10 0 TitleBlockHeight 0))))
              )
            (progn
              (vla-getboundingbox (vlax-ename->vla-object enam) 'ptmin 'ptmax)
              (setq vpno1 (cdr (assoc 69 (entget (setq vp1 (ssname ssvp1 0))))))
              (setq vpno2 (cdr (assoc 69 (entget (setq vp2 (ssname ssvp2 0))))))
              (command "._mspace")
              (setvar "CVPORT" vpno1)
              (vla-zoomwindow (vlax-get-acad-object) ptmin ptmax)
              (setvar "CVPORT" vpno2)
              (vla-zoomwindow (vlax-get-acad-object) ptmin ptmax)
              (vla-zoomscaled (vlax-get-acad-object) KeyZoomFactor acZoomScaledRelative)
              (command "._pspace")
              (vla-zoomextents (vlax-get-acad-object))
            )
            (princ (strcat "\nUnable to find the two vieports needed for layout " id))
          )
          (setq previd id)
          (if (= (length (layoutlist)) 255)
            (progn
              (princ "\nMaximum number of layouts met.")
              (setq grids nil)
            )
          )
          (vla-eval (vlax-get-acad-object) "DoEvents")
        )       
      )
    )
    (princ "\... GridsToLayouts finished.")
    (if UseUndoMarks (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object))))
   )
  )
)

(defun C:GridsToLayouts nil (GridsToLayouts T) (princ))

Adjunto el ejemplo que necesito adaptar

 

 

Gracias,

Saludos.

 

@roherad916 para una mayor claridad @joaquim.moral ha editado el título original:

Crear Layouts de forma automática desde el Moldel. Recuerda consultar cómo escoger el mejor título para tu post. ¡Gracias por participar!
0 Me gusta
Soluciones aceptadas (1)
2.784 Vistas
6 Respuestas
Respuestas (6)
Mensaje 2 de 7

calderg1000
Mentor
Mentor
Solución aceptada

Saludos @roherad916 

He editado la rutina, para que solo reconozca un viewport. Por tu parte debes eliminar el viewport mas pequeño que se encuentra el el layout 001.

Y luego ya puedes cargar y aplicar la rutina.

Espero que te sea de ayuda. Cualquier consulta, estaré atento...

 

(defun GridsToLayouts ( UseUndoMarks / GridLayer GridAttribute SourceLayout TitleBlockHeight KeyZoomFactor
                                       TitleBlockName TitleBlockSheetNumberAttribute TitleBlockTotalSheetsAttribute
                                       vl-GetAttributeValue
                                       ss i enam edata grids grid id previd ssvp1 vp1 vpno1 ssvp2 vp2 vbno2 ptmin ptmax)
  (vl-load-com)

  ;;;*SOME SETTINGS THAT CAN BE CUSTOMIZED
  (setq GridLayer                        "GRID")
  (setq GridAttribute                    "MAPSHTNUM")
  (setq SourceLayout                     "001")
  (setq TitleBlockHeight                 86)
  (setq KeyZoomFactor                    0.5)
  ;(setq TitleBlockName                   "XXX_2")
  ;(setq TitleBlockSheetNumberAttribute   "SHEET_NO")
  ;(setq TitleBlockTotalSheetsAttribute   "NO_OF_SHEETS")

  (defun vl-GetAttributeValue ( blk tag )
    (setq tag (strcase tag))
    (vl-some '(lambda ( att ) (if (= tag (strcase (vla-get-tagstring att))) (vla-get-textstring att)))
        (vlax-invoke blk 'getattributes)
    )
  )
 
  (cond
   ((not (setq ss (ssget "x" (list (cons 0 "INSERT") (cons 8 GridLayer)))))
    (princ (strcat "\nNo grid blocks on layer '" GridLayer "' found."))
   )
   ((not (member SourceLayout (layoutlist)))
    (princ (strcat "\nSource layout '" SourceLayout "' not found."))
   )
   ((> (length (layoutlist)) 1)
    (princ (strcat "\nOnly layouts 'Model' and '" SourceLayout "' should exist."))
   )
   (T
    (setq i 0)
    (while (< i (sslength ss))
	  (setq edata (entget (setq enam (ssname ss i))))
      (if (and
            (= (cdr (assoc 0 edata)) "INSERT")
            (setq attval (vl-GetAttributeValue (vlax-ename->vla-object (cdr (assoc -1 edata))) GridAttribute))
          )
        (setq grids (cons (cons attval enam) grids))
      )
      (setq i (1+ i))
    )
    (setq grids (vl-sort grids (function (lambda (e1 e2) (< (car e1) (car e2))))))

    
    (if UseUndoMarks (vla-StartUndoMark (vla-get-ActiveDocument (vlax-get-acad-object))))
    (if grids
      (princ "\nCreating layouts...")
      (princ "\nNo grids found...")
    )
    (foreach grid grids
      (if grids
        (progn
          (setq id (car grid) enam (cdr grid))
          (princ (strcat "\nCreating layout '" id "'... "))
          (if (not (member id (layoutlist)))
            (command "._layout" "c" previd id)
          )
          (command "._layout" "s" id "._pspace")
          (if (and
                (setq ssvp1 (ssget "x" (list (cons 0 "VIEWPORT") (cons -4 "*,>,*") (list 10 0 TitleBlockHeight 0))))
;;;                (setq ssvp2 (ssget "x" (list (cons 0 "VIEWPORT") (cons -4 "*,<,*") (list 10 0 TitleBlockHeight 0))))
              )
            (progn
              (vla-getboundingbox (vlax-ename->vla-object enam) 'ptmin 'ptmax)
              (setq vpno1 (cdr (assoc 69 (entget (setq vp1 (ssname ssvp1 0))))))
;;;              (setq vpno2 (cdr (assoc 69 (entget (setq vp2 (ssname ssvp2 0))))))
              (command "._mspace")
              (setvar "CVPORT" vpno1)
              (vla-zoomwindow (vlax-get-acad-object) ptmin ptmax)
;;;              (setvar "CVPORT" vpno2)
;;;              (vla-zoomwindow (vlax-get-acad-object) ptmin ptmax)
;;;              (vla-zoomscaled (vlax-get-acad-object) KeyZoomFactor acZoomScaledRelative)
              (command "._pspace")
              (vla-zoomextents (vlax-get-acad-object))
            )
            (princ (strcat "\nUnable to find the two vieports needed for layout " id))
          )
          (setq previd id)
          (if (= (length (layoutlist)) 255)
            (progn
              (princ "\nMaximum number of layouts met.")
              (setq grids nil)
            )
          )
          (vla-eval (vlax-get-acad-object) "DoEvents")
        )       
      )
    )
    (princ "\... GridsToLayouts finished.")
    (if UseUndoMarks (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object))))
   )
  )
)

(defun C:GridsToLayouts nil (GridsToLayouts T) (princ))

 

calderg1000_0-1661361704595.png

 


Carlos Calderon G
EESignature
>Did you find this post helpful? Feel free to Like this post.
Did your question get successfully answered? Then click on the ACCEPT SOLUTION button.

Mensaje 3 de 7

roherad916
Participant
Participant

Gracias, Funcionó perfecto

Ya puede hacer las presentaciones con un solo viewport,

 

Me gustaría agregarle el número de página, veo que la rutina tiene las siguientes lineas:

 

  ;(setq TitleBlockName                   "XXX_2")
  ;(setq TitleBlockSheetNumberAttribute   "SHEET_NO")
  ;(setq TitleBlockTotalSheetsAttribute   "NO_OF_SHEETS")

 

Pero no parecen estar funcionado, Cuando crea todas las presentaciones estas quedan con el mismo numero de página 1  de 26.

 

Luego me gustaría saber si es sencillo hacer otras modificaciones:

* Organizar las páginas por orden en el Eje X y no por orden alfabético como pareciera que lo esta haciendo ahora

* Colocar pagina siguiente y no total de páginas, ya que usamos esta forma de numerar las páginas en nuestro rótulo.

 

Dejo adjuntado un ejemplo con mi propio archivo DWG.

 

Gracias,

Saludos.

 

0 Me gusta
Mensaje 4 de 7

roherad916
Participant
Participant

Buenas de nuevo,

;(setq TitleBlockName "XXX_2")
;(setq TitleBlockSheetNumberAttribute "SHEET_NO")
;(setq TitleBlockTotalSheetsAttribute "NO_OF_SHEETS")

 

Sabes si es posible hacer andar esta parte del código para nombrar las hojas?

Tal vez hay que colocar un Field al atributo de bloque para que lo reconozca?, no pude hacerlo andar

 

 

Muchas Gracias,

 

Saludos.

0 Me gusta
Mensaje 5 de 7

calderg1000
Mentor
Mentor

Saludos @roherad916 

En el siguiente link, se adjunta un código que te permite hacer lo que requieres para enumerar los layouts de tus presentaciones.

https://forums.autodesk.com/t5/autocad-todos-los-productos/numeracion-de-planos-de-forma-automatica/...

Debo comentarte que al parecer el bloque no esta preparado para hacer la numeración y tal como mencionas es posible que se deba crear un bloque aparte con un Field, pero todavía no lo he intentado. 

Espero con un poco de tiempo tratar de adaptar al código que publicaste, para que funcione como lo requieres.

 


Carlos Calderon G
EESignature
>Did you find this post helpful? Feel free to Like this post.
Did your question get successfully answered? Then click on the ACCEPT SOLUTION button.

0 Me gusta
Mensaje 6 de 7

roherad916
Participant
Participant

Gracias por la respuesta, seguiré al pendiente si consigo avanzar con el código.

 

 

Saludos.

0 Me gusta
Mensaje 7 de 7

michael_angulo
Observer
Observer

Gracias, logre agregarla a mis proyectos me el AutoCAD tiene un límite 255, y no logre hacer que el contador empiece igual que, si alguien tan gentil me hecha la mano.

 

(setq SourceLayout                     "001")

Ejemplo: (setq SourceLayout "256")

 

0 Me gusta