Valor por default en DCL

Ver el tema anterior Ver el tema siguiente Ir abajo

Valor por default en DCL

Mensaje por amc.dicsac el Mar Mar 29, 2016 11:56 pm

Hola que tal tengo una duda, alguien me puede decir como puedo obtener valores por defecto en los dcl es decir si selecciono un elemento de un list_box quiero que este mismo se quede grabado cada vez que inicio nuevamente el dcl en un dibujo abierto.

Gracias
avatar
amc.dicsac

Mensajes : 77
Fecha de inscripción : 17/03/2016
Edad : 26
Localización : Lima - Perú

Ver perfil de usuario http://axprogramlisp.blogspot.pe/

Volver arriba Ir abajo

Re: Valor por default en DCL

Mensaje por Dominguez el Miér Mar 30, 2016 12:08 am

amc.dicsac escribió:Hola que tal tengo una duda, alguien me puede decir como puedo obtener valores por defecto en los dcl es decir si selecciono un elemento de un list_box quiero que este mismo se quede grabado cada vez que inicio nuevamente el dcl en un dibujo abierto.

Gracias
Si pones el fichero LSP y DCL seguro que te ayudamos a resolver tu problema
Un saludo
avatar
Dominguez

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

Ver perfil de usuario

Volver arriba Ir abajo

Re: Valor por default en DCL

Mensaje por nolo el Miér Mar 30, 2016 12:14 am

Pues eso, algo para poder hacerte algo ...
De entrada, lo lógico es que guardes el valor de la lista en una variable y la recuperes cada vez que llames a la rutina. Pero imagino que eso ya te lo imaginabas, o no???

Un saludo

nolo

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

Ver perfil de usuario

Volver arriba Ir abajo

Valor por default en DCL

Mensaje por amc.dicsac el Miér Mar 30, 2016 1:29 am

Este programa es una biblioteca de bloques. Su base de datos principal son archivos .txt, se bada principalmente en la lectura de estos archivos .txt
Por ejemplo estos archivos de texto tienen que llevar como prefijo la palabra 1-DWG- entonces tendriamos algo así 1-DWG-TOMACORRIENTES para que puedan ser leidos en el lisp. Ademas estos archivos tienen que estar ubicados en la siguiente ruta "C:\Program Files\AutoCAD 2008" (en mi caso yo uso autocad 2008). Dentro de estos archivos de textos tiene que estar los nombre de los archivo cad de los bloques a insertar (si mi bloque se llama CARRO.dwg dentro de mi archivo .txt abra que escribir CARRO), nunca está demas recordar que los bloques tienen que estar en la ruta de soportes de autocad .

Código:

;; Establecer una variable global para la trayectoria de la raíz - esto se puede acceder en cualquier lugar.
(setq Path:2DAMobBasico "C:/Program Files/")

;;------------------------ GetDwgsMob ------------------------------------------------------------------
;; collects data from the specified directory  (setq folder (GetDwgsMob "AutoCAD 2008"))
;; return ---> "C:/Program Files/AutoCAD 2008/"
;;------------------------------------------------------------------------------------------------------
(defun GetDwgsMob (sParentMob / ListaMob DirMobTipo)
   (if (setq DirMobTipo (strcat Path:2DAMobBasico sParentMob))
      (setq ListaMob (vl-directory-files (strcat DirMobTipo "") "*.txt" 1)
            ListaMob (mapcar (function vl-filename-base) ListaMob))
   ) ;c.if
   ListaMob
) ;c.defun

;;--------------------------- saveVars1 -----------------------------------------
;;Establecemos la variable para la lista
;;Configurar una lista que contenga los elementos seleccionados (blkList1)
;;Guardar la configuración de lista (get_tile "bloqlist1")  
;;Ciclo a través de la lista de conseguir todos los elementos seleccionados
;;-------------------------------------------------------------------------------
(defun saveVars()
   (setq blkList (list))
   (setq ignlist (get_tile "bloqlist"))
   (setq count 1)
   (while (setq fila (read ignlist))
      (setq blkList (append blkList (list (nth fila bloList))))
      (while
         (and
           (/= " " (substr ignlist count 1))
           (/= ""  (substr ignlist count 1)))
         (setq count (1+ count)))
      (setq ignlist (substr ignlist count))))

;;;------------------------- lectura del archivo "1-DWG-TOMACORRIENTES.txt" por defecto --------------------------
(defun blokinf (file / blolist pa ruta)
   (if (and (findfile file) (setq ruta (open file "r")))
      (progn
         (read-line ruta)
         (while (setq pa (read-line ruta))
            (setq bloList (append bloList (list pa))))
         (close ruta)))
   bloList)
;;-----------------------------------------------------------------------------

(defun c:E1 ( / bloqlist$ infolist$ key grr ip lastpt ent )
(setvar "cmdecho" 0)

;;---------------------- Aqui se deberia guarda el valor por defecto del popup_list y del list_box ----------------------------------------
(if (not *E1@) (setq *E1@ (list nil "" "")))
(setq infolist$ (nth 1 *E1@))
(setq bloqlist$ (nth 2 *E1@))

;;-------------------Utilizo la variable global y la construcción de la ruta predeterminada y el nombre de archivo ---------------------
(setq path (strcat Path:2DAMobBasico "AutoCAD 2008/"))
(setq f1 "1-DWG-TOMACORRIENTES")
  
;; Lee la lista de notas de texto por defecto.
(setq bloList (blokinf (strcat path f1 ".txt")))

(setq dcl_id (load_dialog "INSERT-1.dcl")) ;;-----------------------------Agregarle la ruta del archivo
(if (not (new_dialog "INSERTA" dcl_id "" (cond (*screenpointE1*) ('(-1 -1)))))
(progn (prompt "\n**Se produjo ERROR contactese con el Administrador de la aplicación**")
(exit)))

;; Obtiene la lista de archivos de texto desde el camino
;; añadir la versión de AutoCAD a la carpeta
;;********Me gustaria cambiarle esta linea para que me escanee automaticamente la versión de autocad********************
(setq folder (GetDwgsMob "AutoCAD 2008"))

;;--------------------------- Agregando Folders al Popup_list ----------------------------------------
;;Añade la lista de archivos en la popup_box.
;; Utilice la _ax existente: iniciar la función para crear su lista de la lista de bloqueo basado en el archivo correspondiente
;; para el elemento seleccionado.
;;********************Aca biene mi problema 1 no logro que se guarde por defecto en contenido en popup_list**************
(_ax:start "infolist" folder)
(set_tile "infolist" infolist$)
(action_tile "infolist" "(setq infolist$ $value) (_ax:start "bloqlist" (setq bloList (blokinf (strcat path (nth (atoi $value) folder) ".txt"))))")

;;********************Aca biene mi problema 2 no logro que se guarde por defecto en contenido en list_box**************

(_ax:start "bloqlist" bloList)
(set_tile "bloqlist" bloqlist$)
(action_tile "bloqlist" "(setq bloqlist$ $value) (setq bloqxlist (nth (atoi $value) bloList)) ")


;;--------------------------- *AX:Escala1* ----------------------------------------
;; Variable para la escala del bloque a insertar por defecto "1.00"
;;---------------------------------------------------------------------------------
(if (= *AX:Escala1* nil) (set_tile "key_escala1" "1.00") (set_tile "key_escala1" (rtos *AX:Escala1* 2 2)))
(action_tile "key_escala1"  "(setq *AX:Escala1* (atof (get_tile "key_escala1")))")
(mode_tile "key_escala1" 2)

;;---------------------------------------------------------------------------------
(action_tile "cancel" "(setq *screenpointE1* (done_dialog 1))")
(action_tile "accept" "(saveVars)(setq *screenpointE1* (done_dialog 2))")
(setq ddiag (start_dialog))
(unload_dialog dcl_id)
(setq *E1@ (list nil infolist$ bloqlist$))
(if (= ddiag 1) (prompt "\nPrograma Cancelado..."))
(if (= ddiag 2) (insertax))
(setvar "cmdecho" 1)
(princ))
              
;;------------------------ Acción principal del boton INSERTAX --------------------------------------------------
(defun insertax ( )
(setvar "cmdecho" 0)
(setq unitblock (getvar "insunits"))
(setvar "insunits" 4)
      (setq mxb (strcat "\nGirar [I]zquierda / [D]erecha\n" "Activar [O]snap, Punto [B]ase: "))

        (while ;;;
          (cond
            ;;----------------------------------------------
            ;; keyboard input
            ((eq 2 (car (setq grr (grread t 7 0))))
             (setq key (cadr grr))
             (cond
            ;;-------------------------------------------
               ((= key 13)
                (and ent (entdel ent))
                (princ "\n**Cancel**.")
                nil
               )
    
               ;;-------------------------------------------
               ((member (chr key) '("H" "h"))
                 (vl-cmdf "_.insert" (car pa) )
                (while (= (logand (getvar "cmdactive") 1) 1)
                  (command pause)
                 )
                   t
                   )        
               ((member (chr key) '("O" "o"))
                (vl-cmdf "_.move" ent "" "_non" lastpt)
               (while (= (logand (getvar "cmdactive") 1) 1) (command pause))
                   nil        
               )
               ((member (chr key) '("I" "i"))
                 (vl-cmdf "_.rotate" ent "" "_non" ip 90.0)
  t
               )
               ((member (chr key) '("D" "d"))
                 (vl-cmdf "_.rotate" ent "" "_non" ip -90.0)
 t
               )
               ((member (chr key) '("B" "b"))
                 (vl-cmdf "_.move" ent "" (getpoint "\n>> Especifica punto base: ") ip)
 
              (princ mxb)
                 t        
               )
               ;;-------------------------------------------
               ((princ "\nTecla Invalidada.") (princ mxb))
             )
            )
            ;;=====================================================
            ((eq 3 (car grr)) ; point picked, make final star
             (setq ip (cadr grr))  
    
             nil
            )
            ;;=====================================================
            ((eq 5 (car grr)) ; point from mouse, update object
             (setq ip (cadr grr))
             (if (null lastpt) ; first time through
               (progn            
                (setq lastpt ip)
            (princ mxb)
                 (vl-cmdf "_.insert" bloqxlist "_S" *AX:Escala1* "_R" 0.0 "_non" ip)
                 (setq ent (entlast))
               )
             )
              (if (> (distance ip lastpt) 0.00001)
  
              (vl-cmdf "_.move" ent "" "_non" lastpt "_non" ip)
 
                )
             (setq lastpt ip)

            )

          )   ; end cond
            ;;=====================================================
        )     ; while
        (redraw)
(command "explode" ent "")
(setvar "insunits" unitblock)
(setvar "cmdecho" 1)
(princ)
(princ))  

;;;;************ Funcion que reemplaza al famoso start_list *************
(defun _ax:start ( key lst )
   (start_list key)
   (mapcar 'add_list lst)
   (end_list)
   lst
)

Código:
INSERTA : dialog {
          label = "Biblioteca Eléctrica version 2.1 Aplicación 2015";
          initial_focus="bloqlist";
          : column {
            spacer_1;
          : boxed_row { label = " Listado de Bloques  "; alignment = centered;
  spacer_1;
           : list_box { key = "bloqlist"; allow_accept = true; fixed_width_font = false; width=30; height=12; value = "1";}
          : column {
           : button { key = "accept";label = " >> Inse&rtar";is_default = true;mnemonic = "e";width =14;}
           : button { key = "cancel";label = "&Cancelar"; is_default = false; is_cancel = true; mnemonic = "C"; width =14;}
           : row {
           : image_button { key = "save"; width = 5.5; fixed_width = true; fixed_height = true; aspect_ratio = 1;}
           : text  {alignment = centered; label = ">> Guardar bloque";}
                 }
           : row {
           : image_button { key = "load"; width = 5.5; fixed_width = true; fixed_height = true; aspect_ratio = 1 ;}
           : text  {alignment = centered; label = ">> Actualizar listado";}
                 }    
               spacer_1;
           }
   spacer_0;
         }
          spacer_1;
         : edit_box { key = "key_escala1"; fixed_width = false; is_enabled = true;}
         : popup_list { width =40; key = "infolist"; value = "1"; is_enabled = true ; }
          }
         spacer_1;
: row {
    width = 5;
    fixed_width = true;
    alignment = left;
:text  {label = "Copyright (c) Aplicación 2015"; is_bold = true;}
      }
 }

avatar
amc.dicsac

Mensajes : 77
Fecha de inscripción : 17/03/2016
Edad : 26
Localización : Lima - Perú

Ver perfil de usuario http://axprogramlisp.blogspot.pe/

Volver arriba Ir abajo

Re: Valor por default en DCL

Mensaje por Dominguez el Miér Mar 30, 2016 12:25 pm

amc.dicsac escribió:quiero que este mismo se quede grabado cada vez que inicio nuevamente el dcl en un dibujo abierto.
Si quieres que la opcion elegida quede grabada para otra sesion dentro del mismo dibujo, solo tienes que grabarlo en una variable global; ejemplo (setq *opcion* (get_tile "bloqlist")), y devolvera "0" "1" "2" ..................."15" etc , el lugar de la opcion que hemos elegido, entonces con poner una linea que nos diga (set_tile "bloqlist" *opcion*) siempre quedara elegida esa posicion del popup_list.
Pero si queremos que la opcion perdure entre dibujos diferentes, deberemos escribir esa variable en el registro de windows, pero esa es otra historia.
Un saludo
avatar
Dominguez

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

Ver perfil de usuario

Volver arriba Ir abajo

Re: Valor por default en DCL

Mensaje por carlosmgilp el Miér Mar 30, 2016 5:16 pm

Hola muchachos como están.

Yo lo que aplico son diccionarios, así coloco los valores pre-definidos.
Pero no estoy seguro que funcione entre dibujos, tendrías que investigar.

Saludos.

carlosmgilp

Mensajes : 70
Fecha de inscripción : 17/03/2016
Edad : 35
Localización : Venezuela

Ver perfil de usuario

Volver arriba Ir abajo

Valor por default en DCL

Mensaje por amc.dicsac el Miér Mar 30, 2016 5:39 pm

Gracias maestro dominguez pero sigo teniendo el mismo resultado principalmente con el (get_tile "bloqlist")
Código:
(setq *opcion1* (get_tile "bloqlist"))
(set_tile "bloqlist" *opcion1*)
(action_tile "bloqlist" "(setq bloqxlist (nth (atoi $value) bloList)) ")
------------------------------------------------------------------------------
Ahora no se si esta linea crea el conflicto ya que estoy usando en (get_tile "bloqlist") en la siguiente defun
Código:
(defun saveVars()
(setq *opcion2* (get_tile "infolist"))

  (setq blkList (list)) 
  (setq ignlist (get_tile "bloqlist"))
  (setq count 1)
  (while (setq fila (read ignlist))
      (setq blkList (append blkList (list (nth fila bloList))))
      (while
        (and
          (/= " " (substr ignlist count 1))
          (/= ""  (substr ignlist count 1)))
        (setq count (1+ count)))
      (setq ignlist (substr ignlist count))))
avatar
amc.dicsac

Mensajes : 77
Fecha de inscripción : 17/03/2016
Edad : 26
Localización : Lima - Perú

Ver perfil de usuario http://axprogramlisp.blogspot.pe/

Volver arriba Ir abajo

Re: Valor por default en DCL

Mensaje por Dominguez el Jue Mar 31, 2016 12:02 am

Pongo esta rutina como ejemplo de recuerdo de seleccion.
fijate en las lineas que pone ; añadido
Hay esta la clave para que recuerde la ultima seleccion, pero has de tener en cuenta que solo es un ejemplo, si lo estudias podras modificar tu rutina.
Código:
; Inserta notas con directriz, predefinidas en archivos.DAT
 ; Los ficheros.DAT deben estar en la carpeta C:\#NOTAS.
;;;ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
(defun dialog_notas ()
  (setq file (vl-filename-mktemp "dcl.dcl"))
  (setq indi (open file "W"))
  (write-line
    "temp:dialog{label=" INSERCION  de  NOTAS   © 2010";:row{:radio_button{label="Con Directriz";key="con";}
:edit_box{label=" Altura texto";key="alt_new";fixed_width_font=true;fixed_width=true;edit_width=5;edit_limit=6;
allow_accept=true;}:radio_button{label="Sin Directriz";key="sin";}}:row{:list_box{label="Ficheros.dat";
fixed_width_font=true;key="lista_files";width=15;allow_accept=true;}:list_box{label="Notas";key="lista_notas";
fixed_width_font=true;height=15;width=35;allow_accept=true;}}:row{fixed_width=true;alignment=centered;
:boxed_row{label=" Luis Dominguez Gómez © 2007 ";fixed_width=true;:text{key="fecha";}}ok_cancel;}}"
    indi
  )
  (close indi)
)
;;;ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
(defun arch_file ()
  (setq arch (strcat "C:\\#dominguez\\notas" arch))
  (setq file (open (findfile arch) "r"))
  (setq linea (read-line file))
  (setq lista_notas (list linea))
  (while (/= linea nil)
    (setq linea (read-line file))
    (if (/= linea nil)
      (setq lista_notas (append lista_notas (list linea)))
    )
  )
  (close file)
  (start_list "lista_notas")
  (mapcar 'add_list lista_notas)
  (end_list)
)
;;;ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
(defun c:dtnotas (/ file indi arch file linea lista_notas lay nota lista_files opc)
  (setvar 'cmdecho 0)
  (vl-load-com)
  (setq lay (getvar 'clayer))
  (if (not (tblobjname "LAYER" "COTAS_LDG"))
    (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord")
                   '(2 . "COTAS_LDG") '(70 . 0) '(62 . 2) '(6 . "Continuous")
                  )
    )
  )
  (setvar 'clayer "COTAS_LDG")
  (if (not (tblobjname "style" "LDG"))
    (entmake (list '(0 . "STYLE") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbTextStyleTableRecord") '(2 . "LDG")
                   '(70 . 0) '(40 . 3.5) '(41 . 1.0) '(50 . 0.0) '(71 . 0) '(3 . "romans.shx")
                  )
    )
  )
  (setvar 'textstyle "LDG")
  (setvar 'dimtxsty "LDG")
  (dialog_notas)
  (setq indi (load_dialog file))
  (new_dialog "temp" indi)
  (setq lista_files (vl-directory-files "C:\\#dominguez\\notas" "*.dat" 1))
  (start_list "lista_files")
  (mapcar 'add_list lista_files)
  (end_list)
  (set_tile "fecha" (menucmd "M=$(edtime, $(getvar,date),DDDD"" DD MONTH YYYY - HH:MM am/pm)"))
  (set_tile "con" "1")
  (setq opc "con")
  (setvar 'dimzin 1)
  (if alt_new
    (set_tile "alt_new" (rtos alt_new 2 2))
    (set_tile "alt_new" "3.50")
  )
  (if opcion; añadido
    (progn (set_tile "lista_files" opcion) (mode_tile "lista_files" 2)); añadido
  ); añadido
  (mapcar
    'action_tile
    (list "lista_files" "lista_notas" "con" "sin" "accept" "cancel")
    (list
      "(setq arch (nth (atoi $value) lista_files))
          (arch_file)
          (setq opcion (get_tile "lista_files"))"; añadido
      "(setq nota(nth(atoi $value)lista_notas))" "(setq opc "con")"
      "(setq opc "sin")" "(setq alt_new (atof (get_tile "alt_new")))(done_dialog)" "(exit)"
     )
  )
  (vl-file-delete file)
  (start_dialog)
  (unload_dialog indi)
  (setvar 'orthomode 0)
  (setvar 'dimtad 1)
  (vla-put-height (vla-get-activetextstyle (vla-get-activedocument (vlax-get-acad-object))) alt_new)
  (cond ((= opc "con") (princ "\nIndica 2 puntos: ") (vl-cmdf "_leader" "" "" "" nota ""))
        ((= opc "sin") (princ "\nPosición de nota: ") (vl-cmdf "_text" "" "" nota))
  )
  (setvar 'clayer lay)
  (prin1)
)
;;;ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
un saludo
pd:no se como insertar un dibujo.dwg con el cuadro ejemplo


Última edición por Dominguez el Jue Mar 31, 2016 12:19 am, editado 2 veces
avatar
Dominguez

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

Ver perfil de usuario

Volver arriba Ir abajo

Re: Valor por default en DCL

Mensaje por nolo el Jue Mar 31, 2016 12:05 am

A ver, si no te entiendo mal, lo que quieres es que una vez que has llamado a la rutina y has seleccionado un elemento de folder, cuando la rutina pase por  
Código:
(_ax:start "infolist" folder)
(set_tile "infolist" infolist$)
en "infolist" te aparezca la última selección de folder de la que has guardado su número en infolist$, pues ya lo tienes no ??
algo así:
Código:
(_ax:start "infolist" folder)
(set_tile "infolist" (if (distof infolist$) (nth (atoi infolist$) folder) (nth 0 folder) ) )
igual para
Código:
(_ax:start "bloqlist" bloList)
(set_tile "bloqlist" (if (distof bloqlist$) (nth (atoibloqlist$) folder) (nth 0 bloList) ) )

El único tema es que bloList y folder deben ser variables globales para que mantengan su valor hasta que se cierre el dibujo.

Si quieres que estén ahí cuando vuelvas a abrirlo, entonces tendrás que recurrir a los ldata de los diccionarios como dice Carlos, es decir en lugar de hacer un simple setq debes hacer (vlax-ldata-put "nombre_dicc""nombre_variable" valor)para guardar la variable y (setq nombre_variable (vlax-ldata-get "nombre_dicc""nombre_variable")) para recuperala -fíjate bien donde va nombre_variable con comillas y sin ellas-.


He acertado ?? (fallo demasiadas veces)
Un saludo
Dominguez, nos hemos cruzado, le has puesto un ejemplo construyendo los dcl desde el lisp
Eso es ¡¡ pa nota !!


nolo

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

Ver perfil de usuario

Volver arriba Ir abajo

Re: Valor por default en DCL

Mensaje por Dominguez el Jue Mar 31, 2016 12:24 am

nolo escribió:Dominguez, nos hemos cruzado, le has puesto un ejemplo construyendo los dcl desde el lisp
Eso es ¡¡ pa nota !!
Bueno yo tengo ese sistema que me funciona bien, y aunque hay otras formas, con mi sistema me aclaro bien, ya no uso ficheros.DCL aparte.
Tambien es para nota tu aporte de los ldata de los diccionarios, que no domino todavia, pero que lo estudiare para mis necesidades
Saludos
avatar
Dominguez

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

Ver perfil de usuario

Volver arriba Ir abajo

Valor por default en DCL

Mensaje por amc.dicsac el Jue Mar 31, 2016 1:42 am

Gracias por sus respuestas justo ahora las voy aplicar para ver si se soluciona el problema, pero ya que estan hablando de los "vlax-ldata-xxx” aqui dejo algo de hispacad creo que ustedes ya deben de aberlo leido..

http://www.hispacad.com/foro/viewtopic.php?f=2&t=39047
avatar
amc.dicsac

Mensajes : 77
Fecha de inscripción : 17/03/2016
Edad : 26
Localización : Lima - Perú

Ver perfil de usuario http://axprogramlisp.blogspot.pe/

Volver arriba Ir abajo

Valor por default en DCL

Mensaje por amc.dicsac el Jue Mar 31, 2016 7:40 am

Probe por todo los medios pero no logro conseguir lo que quiero:
Para empezar ejecuto la rutina y busco en mi popup_list en archivo de .txt (1-DWG-ALUMBRADO) e inserto mi elemento seleccionado del list_box (atenuador)
Hasta ahi todo de maravilla porqque vuelvo a ejecutar el lisp y se guarda la configuracion realizada


Luego hago el mismo procedimiento busco en mi popup_list en archivo de .txt (1-DWG-TOMACORRIENTES) e inserto mi elemento seleccionado del list_box (interruptores)


Hasta ahi todo me hace creer que todo anda de maravilla pero cuando vuelvo a ejecutar el lisp se me desconfigura todo el unico valor por defecto que se guarda es el del popup_list creo que el problema radica en el list_box pero no logro encontrarle la solución a ese tema.


Adjunto el codigo ya con el dcl incorporado

Código:
;; Set a Global variable for the Root path - this can be accessed anywhere.
(setq Path:2DAMobBasico "C:/Program Files/")
(setq *E1@ nil)

;;------------------------ GetDwgsMob ------------------------------------------------------------------
;; collects data from the specified directory  (setq folder (GetDwgsMob "AutoCAD 2008"))
;; return ---> "C:/Program Files/AutoCAD 2008/"
;;------------------------------------------------------------------------------------------------------
(defun GetDwgsMob (sParentMob / ListaMob DirMobTipo)
   (if (setq DirMobTipo (strcat Path:2DAMobBasico sParentMob))
      (setq ListaMob (vl-directory-files (strcat DirMobTipo "\\") "*.txt" 1)
            ListaMob (mapcar (function vl-filename-base) ListaMob))
   ) ;c.if
   ListaMob
) ;c.defun

;;;---------------------------------------- read file "1-DWG-TOMACORRIENTES.txt" for default --------------------------
(defun blokinf (file / blolist pa ruta)
   (if (and (findfile file) (setq ruta (open file "r")))
      (progn
         (read-line ruta)
         (while (setq pa (read-line ruta))
            (setq bloList (append bloList (list pa))))
         (close ruta)))
   bloList)

(defun c:E1 ( / *opcion1* *opcion2* key grr ip lastpt ent )
(setvar "cmdecho" 0)
(setq load:E1 (DCLE1))
(setq Dcl_Id% (load_dialog load:E1))
(if (not (new_dialog "INSERTA" Dcl_Id% "" (cond (*screenpointE1*) ('(-1 -1)))))
(progn
(alert "\nCuadro de dialogo NO ENCONTRADO")
(exit)))


 ;;-----------------------------------------------------------------------------
(if (not *E1@) (setq *E1@ (list nil "" "")))
(setq *opcion2* (nth 1 *E1@))
(setq *opcion1* (nth 2 *E1@))

;; Use your global variable and build the default path and filename.
(setq path (strcat Path:2DAMobBasico "AutoCAD 2008/"))
(setq f1 "1-DWG-ALUMBRADO")
  
;; Read the list of default text notes.
(setq bloList (blokinf (strcat path f1 ".txt")))

;; Gets the list of text files from the path
;; add version autocad to folder
(setq folder (GetDwgsMob "AutoCAD 2008"))

;;--------------------------- Agregando Folders al Popup_list ----------------------------------------
;; Adds the list of files into the popup_box.
;; Use the existing _ax:start function to create your list in bloqlist based on the file correcponding
;; to the item selected.
(_ax:start "infolist" folder)
(if *opcion2* (progn (set_tile "infolist" *opcion2*) (mode_tile "infolist" 2)))
(action_tile "infolist" "(_ax:start \"bloqlist\" (setq bloList (blokinf (strcat path (nth (atoi $value) folder) \".txt\")))) (setq *opcion2* (get_tile \"infolist\"))")

;; Adds the notes for the default
(_ax:start "bloqlist" bloList)
(if *opcion1* (progn (set_tile "bloqlist" *opcion1*) (mode_tile "bloqlist" 2)))
(action_tile "bloqlist" "(setq bloqxlist (nth (atoi (setq *opcion1* $value)) bloList)) ")
 

;;--------------------------- *AX:Escala1* ----------------------------------------
;; Variable para la escala del bloque a insertar por defecto "1.00"
;;---------------------------------------------------------------------------------
(if (= *AX:Escala1* nil) (set_tile "key_escala1" "1.00") (set_tile "key_escala1" (rtos *AX:Escala1* 2 2)))
(action_tile "key_escala1"  "(setq *AX:Escala1* (atof (get_tile \"key_escala1\")))")
(mode_tile "key_escala1" 2)

;;---------------------------------------------------------------------------------
(action_tile "cancel" "(setq *screenpointE1* (done_dialog 1))")
(action_tile "accept" "(setq *screenpointE1* (done_dialog 2))")
(setq ddiag (start_dialog))
(unload_dialog Dcl_Id%)

(setq *E1@ (list nil *opcion2* *opcion1*))

(if (= ddiag 1) (prompt "\nPrograma Cancelado..."))
(if (= ddiag 2) (insertax))
(setvar "cmdecho" 1)
(princ))
              
;;---------------------------------------------------------------------------------      
(defun insertax ( )
(setvar "cmdecho" 0)
(setq unitblock (getvar "insunits"))
(setvar "insunits" 4)
(command "._insert" bloqxlist "_s" *AX:Escala1*)
(setvar "insunits" unitblock)
(setvar "cmdecho" 1)
(princ))


(defun _ax:start ( key lst )
   (start_list key)
   (mapcar 'add_list lst)
   (end_list)
   lst
)

;;------------------------------ DCL PRINCIPAL ---------------------------------------------------  
(defun DCLE1 (/ dcl_file indi)
(vl-load-com)
(setq dcl_file (vl-filename-mktemp "DCLE1.dcl") indi (open dcl_file "w"))
(write-line "INSERTA : dialog {" indi)
(write-line "          label = \"Biblioteca Eléctrica version 2.1 Aplicación 2015\";" indi)
(write-line "          initial_focus=\"bloqlist\";" indi)
(write-line "          : column {" indi)
(write-line "            spacer_1;" indi)
(write-line "          : boxed_column { label = \" Listado de Bloques  \";" indi)
(write-line "  spacer_1;   " indi)
(write-line "           : list_box { key = \"bloqlist\"; allow_accept = true; fixed_width = false; value = \"1\";}" indi)
(write-line "            : row {" indi)
(write-line "           : button { key = \"accept\";label = \" >> Inse&rtar\";is_default = true;mnemonic = \"e\";width =10;}" indi)
(write-line "           : button { key = \"cancel\";label = \"&Cancelar\"; is_default = false; is_cancel = true; mnemonic = \"C\"; width =10;}" indi)
(write-line "          }" indi)
(write-line "           spacer_1;" indi)
(write-line "         }" indi)
(write-line "          spacer_1;" indi)
(write-line "         : edit_box { key = \"key_escala1\"; fixed_width = false; is_enabled = true;}" indi)
(write-line "         : popup_list { width =10; key = \"infolist\"; value = \"1\"; is_enabled = true ; }" indi)
(write-line "          }" indi)
(write-line "         spacer_1;" indi)
(write-line ": row {" indi)
(write-line "    width = 5;" indi)
(write-line "    fixed_width = true;" indi)
(write-line "    alignment = left;" indi)
(write-line ":text  {label = \"Copyright (c) Aplicación 2015\"; is_bold = true;}" indi)
(write-line "      }" indi)
(write-line " }" indi)
  (close indi)
dcl_file)
avatar
amc.dicsac

Mensajes : 77
Fecha de inscripción : 17/03/2016
Edad : 26
Localización : Lima - Perú

Ver perfil de usuario http://axprogramlisp.blogspot.pe/

Volver arriba Ir abajo

Re: Valor por default en DCL

Mensaje por Dominguez el Jue Mar 31, 2016 1:19 pm

Es muy dificil ver donde falla el programa sin tener todos los ficheros propios de listas.
Lo que pasa es que no se actualiza la lista del list_box aunque se mantiene el elemento 1-DWG-TOMACORRIENTES
creo que debes picar otra vez en el elemento del popup_listpara que se actualice la lista del list_box
avatar
Dominguez

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

Ver perfil de usuario

Volver arriba Ir abajo

Re: Valor por default en DCL

Mensaje por nolo el Jue Mar 31, 2016 4:11 pm

como dice Dominguez, es difícil de seguir ya que no se puede probar, pero vamos a intentarlo
si haces
Código:
(defun c:E1 ( / *opcion1* *opcion2* key grr ip lastpt ent )
te has cargado la posibilidad de comparar con ellas salvo que las guardes en algún otra variable
Luego, no vale toda esta comparación porque no son globales y siempre se hacen con el valor primero al volver a ejecutar la rutina
Código:
(_ax:start "infolist" folder)
(if *opcion2* (progn (set_tile "infolist" *opcion2*) (mode_tile "infolist" 2)))
(action_tile "infolist" "(_ax:start \"bloqlist\" (setq bloList (blokinf (strcat path (nth (atoi $value) folder) \".txt\")))) (setq *opcion2* (get_tile \"infolist\"))")

;; Adds the notes for the default
(_ax:start "bloqlist" bloList)
(if *opcion1* (progn (set_tile "bloqlist" *opcion1*) (mode_tile "bloqlist" 2)))
(action_tile "bloqlist" "(setq bloqxlist (nth (atoi (setq *opcion1* $value)) bloList)) ")

Osea, no tiene nada que ver con lo que te expliqué mas arriba, lo que si que veo que la rutina va cogiendo carácter ....

Sobre los ldata, el problema me ha surgido solo cuando llenas el dibujo con ldata en versiones 2007 y 2011, no lo he probado en la 2015, y consiste simplemente en que en los dxf que sacas de ese dibujo no se colocan bien los valores en el diccionario y cuando intentas cargar el dxf que has creado, pues imposible, te dice que esta corrupto.

Un saludo


nolo

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

Ver perfil de usuario

Volver arriba Ir abajo

Valor por default en DCL

Mensaje por amc.dicsac el Jue Mar 31, 2016 5:46 pm

Adjunto archivos completos
(la carpeta bloques tiene que ser rastreada por el autocad)


y los archivos .txt tienen que estar en la siguiente raiz "C:\Program Files\AutoCAD 2008"


https://www.dropbox.com/sh/usm2frlax2dq9xy/AABjEAzOWbpLRgJlbN-En-fBa?dl=0
avatar
amc.dicsac

Mensajes : 77
Fecha de inscripción : 17/03/2016
Edad : 26
Localización : Lima - Perú

Ver perfil de usuario http://axprogramlisp.blogspot.pe/

Volver arriba Ir abajo

Re: Valor por default en DCL

Mensaje por nolo el Jue Mar 31, 2016 11:41 pm

Ahora si, variables globales *opcion1*,*opcion2*,*AXEscala1* y blolist, esta última hay que rotar la según lo guardado en *opción1* para que en el list-box, la opción elegida aparezca señalada en primera línea.
Código:
(defun c:E1 ( / key grr ip lastpt ent )

;; lo he metido todo en c:bloques
(setq Path:2DAMobBasico "C:/")
(setvar "cmdecho" 0)

(setq load:E1 (DCLE1))
(setq Dcl_Id% (load_dialog load:E1))
(if (not (new_dialog "INSERTA" Dcl_Id% "" (cond (*screenpointE1*) ('(-1 -1)))))
(progn
(alert "\nCuadro de dialogo NO ENCONTRADO")
(exit)))

;;;;;(print (list *opcion2* *opcion1*))

;;-----------------------------------------------------------------------------
(if (not *E1@) (setq *E1@ (list nil "" "")))

;;(setq *opcion2* (nth 1 *E1@))
;;(setq *opcion1* (nth 2 *E1@))

;; Use your global variable and build the default path and filename.
(setq path (strcat Path:2DAMobBasico "bloques/"))
(setq folder (GetDwgsMob "bloques"))

 
;; asignar por defecto
(setq f1 "1-DWG-ALUMBRADO")
(If (or(null bloList)(null (listp bloList)))(setq bloList (blokinf (strcat path f1 ".txt"))) )

;; si existe opción1, rotar la lista hasta que el valor de opción 1 sea el primero
(if (and *opcion1*(distof *opcion1*))(progn
 (repeat (atoi *opcion1*)
 (setq bloList (append (cdr blolist)(list(car blolist))) )
 )
 (setq *opcion1* nil)
))


;;; rellenar menú
(_ax:start "infolist" folder)
(set_tile "infolist" (if (and *opcion2*(distof *opcion2*)) (nth (atoi *opcion2*)folder) f1))
(_ax:start "bloqlist" bloList)
(set_tile "bloqlist" (if (and *opcion1*(distof *opcion1*)) (nth (atoi *opcion1*)bloList) (nth 0 blolist) ))
(if (= *AX:Escala1* nil) (set_tile "key_escala1" "1.00") (set_tile "key_escala1" (rtos *AX:Escala1* 2 2)))
(mode_tile "key_escala1" 2)

;; rellenar acciones
(action_tile "infolist" "(_ax:start \"bloqlist\" (setq bloList (blokinf (strcat path (nth (atoi $value) folder) \".txt\")))) (setq *opcion2* (get_tile \"infolist\"))")
(action_tile "bloqlist" "(setq bloqxlist (nth (atoi $value) bloList)) (setq *opcion1* (get_tile \"bloqlist\")) ")
(action_tile "key_escala1"  "(setq *AX:Escala1* (atof (get_tile \"key_escala1\")))")


;;---------------------------------------------------------------------------------
(action_tile "cancel" "(setq *screenpointE1* (done_dialog 1))")
(action_tile "accept" "(setq *screenpointE1* (done_dialog 2))")
(setq ddiag (start_dialog))
(unload_dialog Dcl_Id%)

(setq *E1@ (list nil *opcion2* *opcion1*))

(if (= ddiag 1) (prompt "\nPrograma Cancelado..."))
(if (= ddiag 2) (insertax))

;;;; (print (list "infolist ="*opcion2* "bloqlist ="*opcion1*))

(setvar "cmdecho" 1)
(princ))

Aunque funciona, piensa que continuamos desconociendo todo los intringulis que te llevan a montar de este modo el lisp, así que tendrás que repasarla y acabarla a tu modo.

Un saludo

nolo

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

Ver perfil de usuario

Volver arriba Ir abajo

Re: Valor por default en DCL

Mensaje por amc.dicsac el Vie Abr 01, 2016 12:30 am

Muchas gracias a todos por la paciencia, creo que este tema queda cerrado, por mi parte estare subiendo el programa completo en los proximos días...
avatar
amc.dicsac

Mensajes : 77
Fecha de inscripción : 17/03/2016
Edad : 26
Localización : Lima - Perú

Ver perfil de usuario http://axprogramlisp.blogspot.pe/

Volver arriba Ir abajo

Re: Valor por default en DCL

Mensaje por Admin el Vie Abr 01, 2016 1:56 am

Veo que ya está funcionando , casi como el HISPACAD, me alegro .

Admin
Admin

Mensajes : 142
Fecha de inscripción : 16/03/2016
Edad : 68
Localización : CORDOBA ARGENTINA

Ver perfil de usuario http://acadhispano.foroargentina.net

Volver arriba Ir abajo

Re: Valor por default en DCL

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

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