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

Seleccionar capas mediante cuadro de diálogo

Ir abajo

Seleccionar capas mediante cuadro de diálogo Empty Seleccionar capas mediante cuadro de diálogo

Mensaje por robierzo Dom Mar 21, 2021 8:38 am

Buenas. Alguien sabe cómo seleccionar una o varias capas mediante un cuadro de diálogo? Mi intención es que se abra un cuadro de diálogo donde aparezcan todas las capas del dibujo, y que podamos seleccionar una o varias capas, para que me devuelva en una lista con las capas seleccionadas.
Vaya por delante que yo no tengo ni idea de cuadros de diálogo.

Gracias!!!!
robierzo
robierzo

Mensajes : 69
Fecha de inscripción : 17/03/2016
Localización : La Coruña

http://www.selmotopografia.es

Volver arriba Ir abajo

Seleccionar capas mediante cuadro de diálogo Empty Re: Seleccionar capas mediante cuadro de diálogo

Mensaje por Admin Dom Mar 21, 2021 3:22 pm

Hola fíjate en esta , no es mía, esta es la página del autor

Gilles Chanteau Programmation AutoCAD LISP/.NET

Código:
;; GETLAYERS (gile) 02/12/07
;; Returns the list of the checked layers in the dialog box
;;
;; arguments
;; title : title of the dialog box or nil (default = Choose the layers)
;; lst1 : list of the pre-checked layers or nil
;; lst2 : list of the unable layers (greyed out) or nil

(defun getlayers (title     lst1       lst2    /         sublist
        toggle_column       tmp       file    lay      layers
        len     dcl_id  lst
       )

  (defun sublist (lst start leng / n r)
    (if   (or (not leng) (< (- (length lst) start) leng))
      (setq leng (- (length lst) start))
    )
    (setq n (+ start leng))
    (repeat leng
      (setq r (cons (nth (setq n (1- n)) lst) r))
    )
  )

  (defun toggle_column (lst)
    (apply 'strcat
     (mapcar
       (function
         (lambda (x)
       (strcat ":toggle{key="
          (vl-prin1-to-string x)
          ";label="
          (vl-prin1-to-string x)
          ";}"
       )
         )
       )
       lst
     )
    )
  )

  (setq   tmp  (vl-filename-mktemp "tmp.dcl")
   file (open tmp "w")
  )
  (while (setq lay (tblnext "LAYER" (not lay)))
    (setq layers (cons (cdr (assoc 2 lay)) layers))
  )
  (setq   layers (vl-sort layers '<)
   len    (length layers)
  )
  (write-line
    (strcat
      "GetLayers:dialog{label="
      (cond (title (vl-prin1-to-string title))
       ("\"Choose the layers\"")
      )
      ";:boxed_row{:column{"
      (cond
   ((< len 12) (toggle_column layers))
   ((< len 24)
    (strcat (toggle_column (sublist layers 0 (/ len 2)))
       "}:column{"
       (toggle_column (sublist layers (/ len 2) nil))
    )
   )
   ((< len 45)
    (strcat (toggle_column (sublist layers 0 (/ len 3)))
       "}:column{"
       (toggle_column (sublist layers (/ len 3) (/ len 3)))
       "}:column{"
       (toggle_column (sublist layers (* (/ len 3) 2) nil))
    )
   )
   (T
    (strcat (toggle_column (sublist layers 0 (/ len 4)))
       "}:column{"
       (toggle_column (sublist layers (/ len 4) (/ len 4)))
       "}:column{"
       (toggle_column (sublist layers (/ len 2) (/ len 4)))
       "}:column{"
       (toggle_column (sublist layers (* (/ len 4) 3) nil))
    )
   )
      )
      "}}spacer;ok_cancel;}"
    )
    file
  )
  (close file)
  (setq dcl_id (load_dialog tmp))
  (if (not (new_dialog "GetLayers" dcl_id))
    (exit)
  )
  (foreach n lst1
    (set_tile n "1")
  )
  (foreach n lst2
    (mode_tile n 1)
  )
  (action_tile
    "accept"
    "(setq lst nil)
    (foreach n layers
    (if (= (get_tile n) \"1\")
    (setq lst (cons n lst))))
    (done_dialog)"
  )
  (start_dialog)
  (unload_dialog dcl_id)
  (vl-file-delete tmp)
  lst
)

 
(setq lista-de-capas(getlayers "lista Capas" nil nil))



Admin
Admin

Mensajes : 223
Fecha de inscripción : 16/03/2016
Edad : 72
Localización : CORDOBA ARGENTINA

https://acadhispano.foroargentina.net

A robierzo le gusta esta publicaciòn

Volver arriba Ir abajo

Seleccionar capas mediante cuadro de diálogo Empty Re: Seleccionar capas mediante cuadro de diálogo

Mensaje por robierzo Dom Mar 21, 2021 5:30 pm

Ufff. Está genial. Muchas gracias, Gabriel!!!!! Es justo lo que buscaba!!!!
Gracias.
robierzo
robierzo

Mensajes : 69
Fecha de inscripción : 17/03/2016
Localización : La Coruña

http://www.selmotopografia.es

Volver arriba Ir abajo

Seleccionar capas mediante cuadro de diálogo Empty Re: Seleccionar capas mediante cuadro de diálogo

Mensaje por Dominguez Lun Mar 22, 2021 9:14 pm

Sin menospreciar la rutina anterior, aqui pongo otra un poquito mas sencilla, que hace lo mismo.
Código:
 ; Devuelve lista de nombres de capas seleccionadas en cuadro.DCL
 ; Luis Dominguez Gomez  "luisfuentef@gmail.com"
(defun c:dtcapas (/ capas lista file ind sel)
  (vl-load-com)
  (defun lista-capas (/ capas)
    (vlax-for x (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
      (setq capas (cons (vla-get-name x) capas))
    )
    (acad_strlsort capas)
  )
  (setq lista (lista-capas))
  (setq file (vl-filename-mktemp nil nil ".dcl"))
  (setq ind (open file "w"))
  (mapcar '(lambda (x) (write-line x ind))
          (list "m_sel:dialog{key=\"rotulo\";"
                ":list_box{key=\"list\";multiple_select=true;height=12;width=40;}"
                "ok_only;}"
          )
  )
  (close ind)
  (setq ind (load_dialog file))
  (new_dialog "m_sel" ind)
  (start_list "list")
  (mapcar 'add_list lista)
  (end_list)
  (set_tile "rotulo" (strcat "Elige Capas :copyright:" (substr (rtos (getvar 'cdate) 2 4) 1 4)))
  (setq sel (set_tile "list" "0"))
  (action_tile "list" "(setq sel $value)")
  (start_dialog)
  (setq sel (mapcar '(lambda (x) (nth x lista)) (read (strcat "(" sel ")"))))
  (unload_dialog ind)
  (vl-file-delete file)
  sel
)

Saludos
Dominguez
Dominguez

Mensajes : 102
Fecha de inscripción : 20/03/2016
Edad : 71
Localización : Zaragoza (España)

A Admin y a robierzo les gusta esta publicaciòn

Volver arriba Ir abajo

Seleccionar capas mediante cuadro de diálogo Empty Re: Seleccionar capas mediante cuadro de diálogo

Mensaje por Dominguez Lun Mar 22, 2021 9:53 pm

Bueno por aqui me aparece otra, que ni sabia que la tenia.
Código:
 ; Devuelve una lista de nombres de capas seleccionadas.
 ; Luis Dominguez Gómez  :copyright: 2012
;;;================================================================================================
(defun dialog_layer ()
  (setq file (vl-filename-mktemp nil nil ".dcl"))
  (setq indi (open file "W"))
  (foreach str (list
                "temp:dialog{label=\" SELECCION  de  CAPAS\";" ;
                "  :list_box{label=\" Todas las Capas del dibujo\";" ;
                "    height=20;" ;
                "    key=\"mi_lista\";" ;
                "    allow_accept=true;" ;
                "    fixed_width_font=true;" ;
                "    multiple_select=true;" ;
                "  }" ;
                "  ok_only;" ;
                "  :boxed_column{label=\" Luis Dominguez Gómez  :copyright: 2012 \";alignment=centered;" ;
                "    :text{key=\"fecha\";alignment=centered;}" ;
                "  }" ;
                "}"
                )
    (write-line str indi)
  )
  (close indi)
)
;;;================================================================================================
(defun count_layer ()
  (setq name (cdr (assoc 2 (tblnext "layer" t))))
  (setq lista (list name))
  (while (/= name nil)
    (setq name (cdr (assoc 2 (tblnext "layer"))))
    (if (/= name nil)
      (progn (setq app (list (strcase name))) (setq lista (append lista app)))
    )
  )
  (tblnext "layer" "rewind")
  (setq lista (acad_strlsort lista)) ; orden alfabetico
  (start_list "mi_lista")
  (mapcar 'add_list lista)
  (end_list)
)
;;;================================================================================================
(defun cuadro_layer ()
  (setq ind (load_dialog file))
  (new_dialog "temp" ind)
  (count_layer)
  (vl-file-delete file)
  (action_tile
    "accept"
    "(setq mi_lista (read (strcat \"(\" (get_tile \"mi_lista\") \")\")))(done_dialog)"
  )
  (set_tile "fecha" (menucmd "M=$(edtime, $(getvar,date),DDDD\"\" DD MONTH YYYY  HH:MM am/pm)"))
  (start_dialog)
  (unload_dialog ind)
)
;;;================================================================================================
(defun c:dtlaysel (/ name lista_sel mi_lista file ind lista app)
  (vl-load-com)
  (dialog_layer)
  (cuadro_layer)
  (setq name (nth (nth 0 mi_lista) lista))
  (terpri)
  (while (/= mi_lista nil)
    (setq name (nth (nth 0 mi_lista) lista))
    (print (read name)) ; una forma
    ;; 0
    ;; OCULTAS_LDG
    ;; PRODUCTO_LDG
    ;; COTAS_LDG
    ;; RAYADO_LDG
    (setq lista_sel (append lista_sel (list name)))
    (setq mi_lista (cdr mi_lista))
  )
  (textpage)
  ;; (print lista_sel) ; otra forma ("0" "OCULTAS_LDG" "PRODUCTO_LDG" "COTAS_LDG" "RAYADO_LDG")
  (prin1)
)
;;;================================================================================================

Dominguez
Dominguez

Mensajes : 102
Fecha de inscripción : 20/03/2016
Edad : 71
Localización : Zaragoza (España)

A Admin y a robierzo les gusta esta publicaciòn

Volver arriba Ir abajo

Seleccionar capas mediante cuadro de diálogo Empty Re: Seleccionar capas mediante cuadro de diálogo

Mensaje por robierzo Mar Mar 23, 2021 7:43 am

Muchas gracias Domínguez!!!! Están genial las dos!!!!!
"Capas haya
que con estas tres rutinas
ni el rey me calla"


Saludos
robierzo
robierzo

Mensajes : 69
Fecha de inscripción : 17/03/2016
Localización : La Coruña

http://www.selmotopografia.es

Volver arriba Ir abajo

Seleccionar capas mediante cuadro de diálogo Empty Re: Seleccionar capas mediante cuadro de diálogo

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba


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