Author Topic: Rutina para restar regiones unas que estan dentro de otras  (Read 610 times)

0 Members and 1 Guest are viewing this topic.

Antonio

  • Mosquito
  • Posts: 1
Hola a todos

Estoy trabajando en una rutina que:

             -en la primera entrada pida en contorno de la pieza.. (ese contorno 󠰡nel siempre tiene que ser una
              polilinea cerrada, y solo será una entidad  ya que después se convierte en region y finalmente, cuando
              se complete con la resta de las regiones denominadas hueco se acabara extruyendo....)

              -En la segunda peticion de seleccion que pida los huecos a restar de la primera region,  y nos los tiene que pedir
               seleccionar mediante SSGET, (para poder seleccionarlo uno a
               uno... mediante  una ventana o como queramos (pero siempre va a ser un conjunto de selecci󮬠 ya que serán varias entidades (Huecos). Estas entidades solo pueden ser Polilineas o Circulos, ya que luego las tiene que  convertir también a Regiones (Para  luego poder restarlas de la polilinea primera, convertida a region).

Hasta aquí lo tengo conseguido.  Lo complicado  para mi viene después y es que soy muy torpe y no se programar....

Necesito que los huecos de la segunda selecci󮠳e resten de la  primera
Y que me devuelva una sola region... en la que estén restados los huecos...

Pienso que necesito un bucle en el que se vayan restando una por una las entidades de la  segunda selecci󮠨los llamados  huecos)....
Pero no se implementarlo.  Alguien me puede ayudar?

Adjunto  lo que tengo escrito de programa hasta ahora y un dibujo DWG de ejemplo...

Muchas gracias por vuestra ayuda


(defun c:RestaRegiones2 ( / i contorno L nhuecos contorno1)

   
         (princ "\nSeleccione el contorno del panel:")

         (setq
         ;selecci󮠣on filtro para incluir solo polilíneas cerradas
               
                       
      contorno   (ssget "_:S" '((0 . "LWPOLYLINE")(-4 . "&") (70 . 1)))
                               
               
   )   ;parentesis fin del primer setq
   
        
   (command "_Region" contorno "")

        (setq contorno1 (entlast))

        (princ "\nSeleccione los huecos a restar:")

         (setq
      ;contador para luego iterar por el selection set
      i   0
      ;selecci󮠣on filtro para incluir solo polilíneas cerradas y circulos
               
                       
      nhuecos      (ssget '((-4 . "<OR")
                                (-4 . "<AND")(0 . "LWPOLYLINE")(-4 . "&") (70 . 1) (-4 . "AND>")
                                (-4 . "<AND")(0 . "CIRCLE")(-4 . "AND>")
                                (-4 . "OR>")
                                ))
                               
               
   )   ;parentesis fin del primer setq
       
          
   ;bucle que itera por el selection set agregando las entidades a la lista L


   (repeat (sslength nhuecos)

           (setq L   (cons (vlax-ename->vla-object (ssname nhuecos i))
                  L
               ))
            i   (1+ i)
   )
   
     
  (command "_Region" nhuecos "")

 

  (command "_.subtract" contorno1 "" huecos "") 


  )  ; fin del DEFUN


ribarm

  • Gator
  • Posts: 3263
  • Marko Ribar, architect
Re: Rutina para restar regiones unas que estan dentro de otras
« Reply #1 on: May 26, 2023, 01:27:06 AM »
You almost succeeded, but ending of routine is bad...
Here is my proposal :

Code: [Select]
(defun c:regionsubtract ( / s reg ss i e )
  (prompt "\nSelect master closed lwpolyline...")
  (if (setq s (ssget "_+.:E:S:L" (list (cons 0 "LWPOLYLINE") (cons -4 "&") (cons 70 1))))
    (progn
      (vl-cmdf "_.REGION" s "")
      (setq reg (entlast))
      (prompt "\nSelect closed entities that would be subtraction regions...")
      (if (setq ss (ssget "_:L" (list (cons -4 "<OR") (cons -4 "<AND") (cons 0 "LWPOLYLINE") (cons -4 "&") (cons 70 1) (cons -4 "AND>") (cons 0 "CIRCLE") (cons -4 "OR>"))))
        (progn
          (repeat (setq i (sslength ss))
            (setq e (ssname ss (setq i (1- i))))
            (vl-cmdf "_.REGION" e "")
            (setq e (entlast))
            (vl-cmdf "_.SUBTRACT" reg "" e "")
            (if (vlax-erased-p reg)
              (setq reg (entlast))
            )
          )
        )
      )
    )
  )
  (princ)
)

Of course untested...
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube