acad hispano
¿Quieres reaccionar a este mensaje? Regístrate en el foro con unos pocos clics o inicia sesión para continuar.

Generar Cuadrado con entmake

3 participantes

Ir abajo

Generar Cuadrado con entmake Empty Generar Cuadrado con entmake

Mensaje por eliasp Jue Feb 16, 2023 7:12 pm

Buen día amigos.

Aquí con una pequeña consulta. Tengo éste código que hice para generar "cuadritos" que se pintan para el cruce de bicicletas por calles y avenidas y quiero ver si me pueden ayudar con unos detalles que me faltan y no he podido resolver.
Código:

(defun ciclovia()
  (if (not (tblobjname "block" "cruce-ciclo"))
    (progn
      (setq pt0 '(0.0 0.0 0.0))
      (setq pt1 '(-0.2 -0.2)
    pt2 '(-0.2 0.2)
    pt3 '(0.2 0.2)
    pt4 '(0.2 -0.2)
    )
      (foreach p (list (list '(0 . "block") '(2 . "cruce-ciclo") '(70 . 0) (cons 10 pt0))
       (list '(0 . "polyline") '(8 . "ciclovia") '(70 . 0) '(40 . 0.05) '(41 . 0.05) '(62 . 86))
       (list '(0 . "vertex") (cons 10 pt1))
       (list '(0 . "vertex") (cons 10 pt2))
       (list '(0 . "vertex") (cons 10 pt3))
       (list '(0 . "vertex") (cons 10 pt4))
       (list '(0 . "seqend"))
       (list '(0 . "endblk")))
 (entmake p)))))
Necesito:

Que me genere el "cuadro cerrado" ya que lo dibuja como "herradura" (aquí supongo que debe haber "algo" para decirle "closed: yes" pero no supe como hacerlo
Que esté "relleno" con hatch sólido, y
Que el color sea "0,113,80" en vez de 86.

Muchas gracias.............

eliasp

Mensajes : 195
Fecha de inscripción : 17/03/2016

Volver arriba Ir abajo

Generar Cuadrado con entmake Empty Re: Generar Cuadrado con entmake

Mensaje por jamescalabut Mar Feb 21, 2023 12:09 am

Buenas tardes,

No te lo voy a resolver todo porque mis conocimientos no llegan a tanto pero, por lo menos, te encamino.

Para cerrar la polilinea debes cambiar el grupo DXF 70 a (70 . 1). Si el valor es cero la polilinea queda abierta.

Para darle un color que no esté en la lista de colores de autocad, hay que introducir dos grupos dxf:
- el de toda la vida, que es el 62
- Un grupo 420 que nos dirigirá al color que buscamos

Para saber el valor del color he dibujado una polilínea con el color 0,113,80 y mediante (entget(car(entsel))) he visto que los grupos son (62 . 126) y (420 . 29008).

Así que añade esos dos grupos DXF a la definición de tu polilínea y te la dibujará de color que quieres.

Sobre el sombreado, estoy trasteando, pero creo que es algo más complicado.

Saludos,

jamescalabut

Mensajes : 7
Fecha de inscripción : 27/07/2018

Volver arriba Ir abajo

Generar Cuadrado con entmake Empty Re: Generar Cuadrado con entmake

Mensaje por jamescalabut Mar Feb 21, 2023 11:52 am

Buenos días,

Con respecto a los colores verdaderos y la manera de ponerlos en el grupo 420, si no he entendido mal lo que he leído, funciona de la siguiente manera:

Se pasan los valores del color verdadero a hexadecimal y a continuación se halla el valor decimal del número hexadecimal RRGGBB.

Veamos nuestro caso (0,113,80):

Decimal 000 === Hexadecimal 00
Decimal 113 === Hexadecimal 71
Decimal 080 === Hexadecimal 50

Hexadecimal 007150 === Decimal 29008

He hecho un par de comprobaciones y me funciona, pero mis conocimientos son limitados.

Para el grupo 62, que aunque no le hace caso tiene que ir en el entmake, he leído que debe ponerse el color de autocad más parecido, pero he probado con varios distintos y el resultado ha sido el mismo.

Saludos,



jamescalabut

Mensajes : 7
Fecha de inscripción : 27/07/2018

Volver arriba Ir abajo

Generar Cuadrado con entmake Empty Re: Generar Cuadrado con entmake

Mensaje por eliasp Mar Feb 21, 2023 2:54 pm

Muchas gracias, voy a tomar notas.

Saludos

eliasp

Mensajes : 195
Fecha de inscripción : 17/03/2016

Volver arriba Ir abajo

Generar Cuadrado con entmake Empty Re: Generar Cuadrado con entmake

Mensaje por kasperle Mar Feb 21, 2023 4:01 pm

Tal vez sea más sencillo de hacer usando las funciones VLA...

Código:

(defun C:TST (/ ad cn co er po tsterr)

  (vl-load-com)
  
  (defun tsterr ()
    (if ad (vlax-release-object ad))
    (if po (vlax-release-object po))
    (if co (vlax-release-object co))
    (setq *error* er)
    (princ)
    )

  (setq er *error*
          *error* tsterr
      )
  
  (if (not (tblobjname "block" "cruce-ciclo"))
    (progn
      (setq cn 0
              ad (vla-get-activedocument (vlax-get-acad-object))
              po (vla-addlightweightpolyline ; No parece que vaya a ser necesaria una polilínea 3D
                      (vla-get-modelspace ad)
                         (vlax-safearray-fill
                            (vlax-make-safearray vlax-vbdouble '(0 . 7))
                            '(-0.2 -0.2 -0.2 0.2 0.2 0.2 0.2 -0.2)
                            )
                         )
               co (vla-get-truecolor po)
            )
      (vla-put-closed po :vlax-true) ; Cierra la polilínea
      (while (> 4 cn) (vla-setwidth po cn 0.05 0.05) (setq cn (1+ cn))) ; Aplica grosor por cada tramo
      (vla-setrgb co 19 76 0) ; Cambia el color a RGB aproximado al ACI 86
      (vla-put-truecolor po co)
      (vla-copyobjects ad
          (vlax-safearray-fill
             (vlax-make-safearray vlax-vbObject '(0 . 0))
             (list po)
             )
          (vla-add (vla-get-blocks ad) (vlax-3d-point '(0. 0. 0.)) "cruce-ciclo")
          )
      (vla-delete po)
      (vlax-release-object ad)
      (vlax-release-object po)
      (vlax-release-object co)
      (alert "Nuevo bloque \"cruce-ciclo\" generado.")
      (gc)
      )
    (alert "El bloque \"cruce-ciclo\" ya existe.")
    )
  
  (setq *error* er)
  (princ)
  )

kasperle

Mensajes : 28
Fecha de inscripción : 18/03/2016

Volver arriba Ir abajo

Generar Cuadrado con entmake Empty Re: Generar Cuadrado con entmake

Mensaje por jamescalabut Miér Feb 22, 2023 12:03 pm

Como no era cuestión de descubrir el Mediterráneo a estas alturas, la obtención del color verdadero a partir del RGB ya estaba inventado.

El gurú Lee Mac tiene en su página todas las conversiones posibles y, entre ellas, el paso de RGB a color verdadero.


Código:

;; RGB -> True  -  Lee Mac
;; Args: r,g,b - [int] Red, Green, Blue values

(defun LM:RGB->True ( r g b )
    (logior (lsh (fix r) 16) (lsh (fix g) 8) (fix b))
)


Si lo aplicas al 0 113 80, obtienes el 29008.

jamescalabut

Mensajes : 7
Fecha de inscripción : 27/07/2018

Volver arriba Ir abajo

Generar Cuadrado con entmake Empty Re: Generar Cuadrado con entmake

Mensaje por jamescalabut Jue Feb 23, 2023 9:01 pm

Hola,

La solución estaba en los foros. Esta rutina de VLA en Cadtutor
https://www.cadtutor.net/forum/topic/33659-how-to-create-solid-hatch-by-using-lisp/
nos da la solución.

He modificado las dimensiones y el color según querías.

Saludos,


Código:
(defun tst()
;; Rutina de VLA ligeramente modificada en dimensiones y color
(defun entmakex-solidhatch ( L )
 ;; L - list of list point. like ((pt11 pt12 pt13)(pt21 pt22 pt23))
 ;; Use
;;;(entmakex-solidhatch
;;;    (list
;;;      (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (car (entsel "\nSelect Polyline:")))))
;;;      );_  list
;;;

 (entmakex
 (apply
  'append
  (list
  (list '(0 . "HATCH")
        '(100 . "AcDbEntity")
        '(410 . "Model")
        '(100 . "AcDbHatch")
        '(10 0.0 0.0 0.0)
        '(210 0.0 0.0 1.0)
        (cons 2 "cruce-ciclo")
        '(70 . 1)
        '(71 . 0)
     '(62 . 106); modificacion del original para cambiar el color
    '(420 . 29008); modificacion del original para cambiar el color
        (cons 91 (length L))
  ) ;_  list
  (apply 'append
          (mapcar '(lambda (a)
                    (apply 'append
                          (list (list '(92 . 7) '(72 . 0) '(73 . 1) (cons 93 (length a)))
                                (mapcar '(lambda (b) (cons 10 b)) a)
                                '((97 . 0))
                          ) ;_  list
                    ) ;_  apply
                  ) ;_  lambda
                  L
          ) ;_  mapcar
  ) ;_  apply
  (list '(75 . 0)
        '(76 . 1)
        '(47 . 1.)
        '(98 . 2)
        '(10 0. 0. 0.0)
        '(10 0. 0. 0.0)
        '(450 . 0)
        '(451 . 0)
        '(460 . 0.0)
        '(461 . 0.0)
        '(452 . 0)
        '(462 . 0.0)
        '(453 . 2)
        '(463 . 0.0)
        '(63 . 256)
        '(463 . 1.0)
        '(63 . 256)
        '(470 . "LINEAR")
  ) ;_  list
  ) ;_  list
 ) ;_  apply
)
 )





(entmake (list (cons 0 "BLOCK") (cons 2 "cruce-ciclo") (cons 70 0) (list 10 0 0 0))); crea un nuevo bloque
(entmakex-solidhatch (list(list '(0.2 0.2 0.0) '(-0.2 0.2 0.0) '(-0.2 -0.2 0.0) '(0.2 -0.2 0.0))));elemento del bloque
(entmake (list (cons 0 "ENDBLK"))); cierra la definición del bloque
(entmake (list (cons 0 "INSERT") (cons 2 "cruce-ciclo") (list 10 0.0 0.0 0.0))); inserta el bloque

)

jamescalabut

Mensajes : 7
Fecha de inscripción : 27/07/2018

Volver arriba Ir abajo

Generar Cuadrado con entmake Empty Re: Generar Cuadrado con entmake

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.