Lisp para igualar las coordenadas de dos objetos distintos

Lisp para igualar las coordenadas de dos objetos distintos

osniel_vega
Explorer Explorer
1.561 Vistas
7 Respuestas
Mensaje 1 de 8

Lisp para igualar las coordenadas de dos objetos distintos

osniel_vega
Explorer
Explorer

Hola, buenos días

Existe algún lisp que iguale las coordenadas de dos objetos distintos? Digamos que tengo un bloque con un punto de inserción definido, siendo esas sus coordenadas y quiero que al seleccionar el bloque me dé la opción de seleccionar otro objeto para que tome las coordenadas de ese otro, digamos por ejemplo una línea.

Aunque una línea suele tener dos puntos y normalmente las coordenadas suelen ser las del primero, pero esa sería otra solución a implementar para modificar el punto de inserción de las líneas y colocarlo en la parte superior de la línea que es donde me interesa que se coloque el bloque.

 

Ya si existe un lisp que haga todo junto sería genial, o sea selecciono el primer objeto (el bloque) y luego al seleccionar el segundo objeto (la línea) el primero toma las coordenadas del segundo, pero del final de la línea, o sea la parte superior. 

En fin, agradezco cualquier información o ayuda al respecto.

0 Me gusta
Soluciones aceptadas (2)
1.562 Vistas
7 Respuestas
Respuestas (7)
Mensaje 2 de 8

Kent1Cooper
Consultant
Consultant

That is probably possible, but if you need to select the Block and the Line anyway, can you simply have ENDpoint Object Snap among the modes that are running, pick the Block, grab its insertion-point grip and drag it to the desired Line endpoint?

 

But even if a custom command would save you one pick [2 steps -- pick the Block and the Line, instead of 3 steps -- pick the Block, grab its grip and pick the Line endpoint], not all Lines have an upper or top end.  Are you working in such a specialized situation that you would never have a horizontal Line?

Kent Cooper, AIA
0 Me gusta
Mensaje 3 de 8

osniel_vega
Explorer
Explorer

Hola @Kent1Cooper , gracias por la respuesta, aunque eso es lo que habitualmente hago, lo que sucede es que tengo que estar constantemente acercando o alejando con la rueda del ratón, además de seleccionar cada pinzamiento acercarme o alejarme, sé que no es una solución inmensamente superior a lo que comentas, pero me agilizaría el proceso ya que puedo clicar donde sea en cada objeto, sin que un pinzamiento me falle o hacer zoom o no.

0 Me gusta
Mensaje 4 de 8

Kent1Cooper
Consultant
Consultant
Solución aceptada

Something like this?

 

(defun C:BUEL ; = Block to Upper End of Line
  (/ Bsel Bdata blk Lsel Ldata e1 e2)
  (if
    (and
      (setq Bsel (entsel "\nSelect Block to relocate: "))
      (setq Bdata (entget (setq blk (car Bsel))))
      (member '(0 . "INSERT") Bdata)
      (setq Lsel (entsel "\nSelect Line to relocate Block to its Upper End: "))
      (setq Ldata (entget (car Lsel)))
      (member '(0 . "LINE") Ldata)
    ); and
    (progn ; then
      (setq e1 (cdr (assoc 10 Ldata)) e2 (cdr (assoc 11 Ldata)))
      (command "_.move" blk "" ; then
        "_non" (cdr (assoc 10 Bdata)); insertion point
        "_non" (if (> (cadr e2) (cadr e1)) e2 e1)
      ); command
    ); progn
    (prompt "\nYou did not select a Block and a Line."); else
  ); if
  (prin1)
)

 

Change the command name to something that means more to you, and the prompts to Spanish, etc.

If the Line is horizontal, the Block goes to its start point.

Kent Cooper, AIA
0 Me gusta
Mensaje 5 de 8

osniel_vega
Explorer
Explorer

@Kent1Cooper funciona a la perfección, agradezco tu tiempo, pensé que existiría algo ya creado, no que lo harías, eres un crack.

Sería grandioso que además de con bloques funcionara con otros objetos como texto, textoM, entre otros y que permitiera elegir entre punto inicial, medio o final de la línea o polilínea, pero eso ya es otro tema para desarrollar un lisp más completo y útil para otros casos.

Lo cierto es que lo que estaba buscando, me lo has facilitado y lo otro queda como una propuesta a desarrollar si lo crees conveniente en algún momento.

Muchas gracias.

 

0 Me gusta
Mensaje 6 de 8

calderg1000
Mentor
Mentor
Solución aceptada

Saludos @osniel_vega 

Prueba este código, espero te sea de ayuda...

;;;___
(defun c:Mbl (/ s sn p ps pe pm lp I F M opc bd)
  (while (setq s (ssget '((0 . "insert,line"))))
    (setq sn (vl-remove-if 'listp (mapcar 'cadr (ssnamex s))))
    (foreach x sn
      (if (= (cdr (assoc 0 (entget x))) "INSERT")
        (setq bd (entget x)
              p  (cdr (assoc 10 bd))
        )
        (setq ps (cdar (vl-remove-if-not '(lambda (i) (= (car i) 10)) (entget x)))
              pe (cdar (vl-remove-if-not '(lambda (j) (= (car j) 11)) (entget x)))
              pm (mapcar '(lambda (m n) (/ (+ m n) 2.)) ps pe)
        )
      )
    )
    (setq lp (vl-sort (list ps pe) '(lambda (u w) (< (cadr u) (cadr w)))))
    (initget 1 "I F M")
    (setq opc
           (getkword
             "\nSeleccione Posicion de Pto. en la Linea para mover el Bloque [Inicio/Medio/Final]<I>:"
           )
    )
    (if (= opc "I")
      (setq bd (entmod (subst (cons 10 (car lp)) (assoc 10 bd) bd)))
    )
    (if (= opc "M")
      (setq bd (entmod (subst (cons 10 pm) (assoc 10 bd) bd)))
    )
    (if (= opc "F")
      (setq bd (entmod (subst (cons 10 (cadr lp)) (assoc 10 bd) bd)))
    )
  )
  (princ)
)

 

Mueve Bloque al Pto. en Linea.gif

 

 


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 7 de 8

osniel_vega
Explorer
Explorer

@calderg1000  funciona muy bien con bloques comunes, solo una cosa, por alguna razón con los bloques que tienen atributos termina desplazando los pinzamientos y no el contenido del bloque, te adjunto captura.

osniel_vega_0-1723022759020.png

Ese bloque tiene 4 distintos atributos y a todos les desplazó los pinzamientos, en este caso al punto medio de la línea, como le ordené claramente utilizando el lisp.

 

Muchas gracias por tu tiempo, eres un crack.

0 Me gusta
Mensaje 8 de 8

calderg1000
Mentor
Mentor

Saludos @osniel_vega 

Le adicione una líneas de código, para actualizar los bloques que contienen atributos.

Espero que te sea de ayuda.

;;;___
(defun c:Mbl (/ s sn p ps pe pm lp I F M opc bd)
  (while (setq s (ssget '((0 . "insert,line"))))
    (setq sn (vl-remove-if 'listp (mapcar 'cadr (ssnamex s))))
    (foreach x sn
      (if (= (cdr (assoc 0 (entget x))) "INSERT")
        (setq bd (entget x)
              p  (cdr (assoc 10 bd))
        )
        (setq ps (cdar (vl-remove-if-not '(lambda (i) (= (car i) 10)) (entget x)))
              pe (cdar (vl-remove-if-not '(lambda (j) (= (car j) 11)) (entget x)))
              pm (mapcar '(lambda (m n) (/ (+ m n) 2.)) ps pe)
        )
      )
    )
    (setq lp (vl-sort (list ps pe) '(lambda (u w) (< (cadr u) (cadr w)))))
    (initget 1 "I F M")
    (setq opc
           (getkword
             "\nSeleccione Posicion de Pto. en la Linea para mover el Bloque [Inicio/Medio/Final]<I>:"
           )
    )
    (if (= opc "I")
      (setq bd (entmod (subst (cons 10 (car lp)) (assoc 10 bd) bd)))
    )
    (if (= opc "M")
      (setq bd (entmod (subst (cons 10 pm) (assoc 10 bd) bd)))
    )
    (if (= opc "F")
      (setq bd (entmod (subst (cons 10 (cadr lp)) (assoc 10 bd) bd)))
    )
  (if (ssget "_X" '((0 . "insert") (66 . 1)))
  (command "ATTSYNC" "N" "*")
  )
)
  (princ)
)

 


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