MJLM 发表于 2022-7-5 22:54:45

保存全局变量值

其思想是将某些lisp例程的一些全局变量存储在图形文件中,以便当我再次加载此图形时,这些值会重新加载到会话内存中。
 
我找到了
vlax ldata put和vlax ldata get
 
但是这些命令与特定实体一起工作,还是我错了?
我发现它限制和不适合选择
存储值的实体。
最好的方法是什么?

Tharwat 发表于 2022-7-5 23:03:51

你好
 
您可以将变量导出到txt文件,并将其保存在support文件夹或任何您想要的位置,然后您可以通过文件名及其内容调用该文件,或者您可以创建字典,如果您在许多字典中有许多值要保存,则会增加图形的大小。
 
这取决于你。

Bhull1985 发表于 2022-7-5 23:06:52

你也可以尝试(vl-bb-set)和(vl-bb-ref)方法,有很多关于这两种方法的文档,它们非常容易使用。
 
 
其中,仅供参考,代表visual lisp、blackboard、set/ref。
必须检查文档以确定这些值存储在何处,除非有人知道这些值。

MJLM 发表于 2022-7-5 23:14:33

谢谢你们俩。bhull提出的方法似乎非常快速和灵活。
 
编辑:似乎(vl bb集合)和(vl bb ref)仅在一个autocad任务期间有效,而不是每个图形文件。无论我打开什么文件,都会加载相同的值,并且只加载一个会话。我将不得不对此进行更深入的研究。

Snownut 发表于 2022-7-5 23:18:46

BB变量的问题是,当您关闭图形时,它们会丢失,我建议您学习在每个图形中创建自定义词典。如果保存简单值,则不会使图形大小增加太多。外部文本文件的问题是,如果执行撤消命令等操作,则需要进行大量编码,以确保所有变量都已更改(我尝试了不太好的方法)。此外,如果将图形中的值保存在字典中,则无需将文本文件与图形文件一起保存,尤其是如果要将它们发送给某人。我在一个自定义字典中保存了大约100个变量值,没有问题。您还需要学习正确的DXF代码来保存您的值,无论它们是文本、整数、实数点值等。一旦您解决了问题,保存值的方法是非常安全可靠的。此外,如果撤消创建或设置变量值的lisp函数,这些值将自动恢复。(就像撤销一样)。

Bhull1985 发表于 2022-7-5 23:23:49

 
 
 
是的,那是我的错。如果没有更彻底地测试vl bb set/ref命令,我会知道它们只适用于当前会话。
似乎白雪公主法是实现你要求的最好方法。
就我个人而言,我会创建一个工具栏按钮和宏来访问你的字典,这样你就可以点击一下,然后用你添加的任何信息进行编辑。
工具栏按钮或lisp例程,只是为了方便访问和修改字典。
也许斯诺努特会帮上忙。。。。虽然我相信我们可以找到一些有效的方法,但这需要研究和时间。。。我没有自动取款机

Snownut 发表于 2022-7-5 23:25:50

下面是我使用的代码,有几个函数和子函数都包含在内;
 
1.-创建新词典
2.-在创建的字典中创建新的xrecord
3.-附加xrecord
4.读取X记录
5.-更新xrecord
 
在这些功能上,我得到了李·麦克的一点帮助,它们在ACAD 2004和至少2011年以及Bricscad 12到当前版本中都能完美地工作。
 


;=============================Begin < GM_Dict > Function =====================================;
;             Function to Create the "SADATA_DICT" within the NOD                ;
;      Syntax for function call;                              ;
;                  (GC_Dict< dictname >)                           ;
;      Example - (GC_Dict "SADATA_DICT")                            ;
;                                  Created by B. Fillmore                                       ;

(defun GC_Dict ( dictname / adict)
(if (not (setq adict (dictsearch (namedobjdict) dictname)))
   (progn
   (setq adict (entmakex '((0 . "DICTIONARY")(100 . "AcDbDictionary"))))
   (if adict (setq adict (dictadd (namedobjdict) dictname adict)))
   )
   (setq adict (cdr (assoc -1 adict)))
)
);defun

;(GC_Dict "SADATA_DICT") Calling Line                              ;
;                                                ;
;==============================End < GM_Dict > Function ======================================;


;===========================Begin < GM_Xrecord > Function ====================================;
;         Function to Create an XRECORD in the "SADATA_DICT" within the NOD      ;
;      Syntax for function call;                              ;
;            (GM_Xrecord < XRECORD NAME >)                        ;
;      Example -   (GM_Xrecord "LDATA_VARS")                        ;
;                                  Created by B. Fillmore                                       ;

(defun GM_Xrecord ( DATA_VARS / adict anXrec)
(cond
   (
    (setq adict (GC_Dict "SADATA_DICT")) ; "SADATA_DICT" is the name of the dictionary
    (cond   
      (
   (not
   (setq anXrec (dictsearch adict DATA_VARS))
   )
   (setq anXrec (entmakex values))   
       (if anXrec (setq anXrec (dictadd adict DATA_VARS anXrec))
   );if
   );not
      (setq anXrec
   (cdr (assoc -1 (dictsearch adict DATA_VARS)))
   );setq
      );cond
    );setq
   );cond
);defun

;(GM_Xrecord "EDATA_VARS") Calling Line   (setq DATA_VARS "EDATA_VARS")                ;
;                                                ;
;============================End < GM_Xrecord > Function =====================================;


;===========================Begin < Append_Xrecord >Function ===============================;
;         Function to addvalues to an existing XRECORD using the DXF Group Code      ;
;      Syntax for function call;                              ;
;                  (Append_Xrecord <XRECORD NAME> <DXF Group Code to Update> <Value to store>)    ;
;      Example - (Append_Xrecord "EDATA_VARS" 45 0.0)                        ;
;                                                                                             ;
;      Returns all associations of a key in an association list            ;
;                                  Created by B. Fillmore                                       ;


(defun Append_Xrecord (DATA_VARS DXF_VAL NEW_VAL / SAdict anXrec xRecFile)
(setq DATA_VARS (strcat tabname DATA_VARS)
   SAdict (GC_Dict "SADATA_DICT")
   anXrec (dictsearch SAdict DATA_VARS)
   )
(if (= (assoc DXF_VAL anXrec)nil)
   (progn
   (setq values (append anXrec
            (list(cons DXF_VAL NEW_VAL))
            )
       )
   (entdel (cdr (assoc -1 anXrec)))
   (GM_Xrecord DATA_VARS)
   )
   )
);defun

;(Append_Xrecord "EDATA_VARS" 46 0.0) Calling Line   (setq DATA_VARS "EDATA_VARS")      ;
;                                                ;
;==========================End < Append_Xrecord > Function ===================================;

   

;===========================Begin < GetVar_Xrecord >Function ===============================;
;         Function to retrieve values from an XRECORD using the DXF Group Code      ;
;      Syntax for function call;                              ;
;                  (GetVar_Xrecord <XRECORD NAME> <DXF Group Code to Update> <Nth Group Code>)    ;
;      Example - (GetVar_Xrecord "LDATA_VARS" 300 2)                        ;
;                                                                                             ;
;                  LM:mAssoc-By; Lee Mac                        ;
;      Returns all associations of a key in an association list            ;
;                                  Created by B. Fillmore                                       ;


(defun GetVar_Xrecord ( DATA_VARS DXF_VAL LnmBr / xRecFile vars )
(defun LM:mAssoc ( DXF_VAL xRecFile / item )
   (if (setq item (assoc DXF_VAL xRecFile))
   (cons (cdr item) (LM:mAssoc DXF_VAL (cdr (member item xRecFile))))
   )
   );defun

(if (/= DATA_VARS "ODATA_VARS") ; "ODATA_VARS is a set of DXF codes within the dictionary
   (setq DATA_VARS (strcat tabname DATA_VARS))
   )
(setq vars (GM_Xrecord DATA_VARS))
(cond (vars
      (setq xRecFile(entget vars))
    (cdr (cons DXF_VAL(nth LnmBr (LM:mAssoc DXF_VAL xRecFile))))
       )
       (T nil)
)
);defun

;(setq VARNAME (GetVar_Xrecord "LDATA_VARS" 300 2)) Calling Line                ;
;                                                ;
;==========================End < GetVar_Xrecord > Function ===================================;


;==========================Begin < Update_Xrecord > Function =================================;
;         Function to Update the values in an XRECORD using the nth DXF Group Code    ;
;      Syntax for function call;                              ;
;    (Update_Xrecord <XRECORD NAME> <DXF Group Code to Update> <New Value> <Nth Group Code>)    ;
;      Example - (Update_Xrecord "LDATA_VARS" 300 "Update test successful!" 3 )      ;
;                                                                                             ;
;               LM:mAssoc-By; Lee Mac                        ;
;      Returns all associations of a key in an association list            ;
;                                  Created by B. Fillmore                                       ;


(defun Update_Xrecord (DATA_VARS DXF_VAL MOD_VAL LnmBr / xRecFile Values SAdict)
(defun LM:mAssoc ( DXF_VAL xRecFile / item )
   (if (setq item (assoc DXF_VAL xRecFile))
   (cons (cdr item) (LM:mAssoc DXF_VAL (cdr (member item xRecFile))))
   )
   );defun
(if (/= DATA_VARS "ODATA_VARS")
   (setq DATA_VARS (strcat tabname DATA_VARS))
   )
(setq    SAdict (dictsearch (namedobjdict) "SADATA_DICT")
   xRecFile (dictsearch (cdr (assoc -1 SAdict)) DATA_VARS)
   )
(setq values (subst (cons DXF_VAL MOD_VAL)
             (cons DXF_VAL (nth LnmBr (LM:mAssoc DXF_VAL xRecFile)))
             xRecFile)
   )
(entdel (cdr (assoc -1 xRecFile)))
(GM_Xrecord DATA_VARS)
);defun

; (setq   DATA_VARS"LDATA_VARS")

;(Update_Xrecord "LDATA_VARS" 300 "Nmbr" 2)Calling line                  ;
;                                                ;
;==========================End < Update XRecord > Function ===================================;


;============================Begin < New_Xrecord > Function ==================================;
;         Function to Create an XRECORD with Default Values                ;
;    Syntax for function call;                              ;
;            (New_Xrecord <XRECORD NAME> )                        ;
;    Example -    (Update_Xrecord "LDATA_VARS")                        ;
;                                  Created by B. Fillmore                                       ;
;                                                                                             ;

(defun New_xRecord ( DATA_VARS / Values vars)
(if (/= DATA_VARS "EDATA_VARS" DATA_VARS "HDATA_VARS"
   DATA_VARS "LDATA_VARS" DATA_VARS "ODATA_VARS")         
   (progn
   (alert "There are no xRecord Values to Create xRecord for !
         \nYou must enter the Values Reference to proceed !")
   (exit)
   );progn
   );if

(if (= DATA_VARS "EDATA_VARS" )
   (setq DATA_VARS (strcat tabname DATA_VARS)
      Values(list(cons 0 "XRECORD"    )    ; used for EDA Data File Defaults in "XRECORDS"
            (cons 100"AcDbXrecord"    )
            (cons   3 "0"      )
            (cons400.0      )
            (cons410.0      )
            (cons420.0      )
            (cons430.0      )
            (cons440.0      )
            (cons450.0      )
            (cons460.0      )
            (cons470.0      )               
            (cons700      )
            (cons710      )
            (cons720      )
            (cons730      )
            (cons740      )
            (cons750      )
            (cons760      )
            (cons770      )
            (cons780      )
            (cons790      )               
            (cons 2700      )
            (cons 2710      )
            (cons 2720      )
            (cons 2730      )               
            (cons 300 "0"      )
            (cons 301 "0"      )
            )
   );setq
   );if

;(setq DATA_VARS "EDATA_VARS")
;(New_Xrecord "EDATA_VARS")


(if (= DATA_VARS "HDATA_VARS" )
   (setq DATA_VARS (strcat tabname DATA_VARS)
   Values(list(cons 0 "XRECORD"    )    ; used for House Data File in "XRECORDS"
            (cons 100"AcDbXrecord"    )
            (cons400.0      )
            (cons410.0      )
            (cons70   0      )
            (cons71    36      )
            (cons72    10      )               
            (cons 270   1      )
            (cons 271   0         )
            (cons 272   0      )
            (cons 273   0      )               
            (cons 300 "Drain Outlet"    )
            )
   );setq
   );if

;(entmakex values)

;(setq DATA_VARS "HDATA_VARS")

(if (= DATA_VARS "LDATA_VARS" )
   (setq DATA_VARS (strcat tabname DATA_VARS)
   Values(list(cons 0 "XRECORD"    )    ; used for Lot Data File in "XRECORDS"
            (cons 100 "AcDbXrecord"    )
            (cons   3 "Septic Assistant")
            (cons70   0      )
            (cons71   0      )
            (cons 300 "Town"      )
            (cons 300 "County"    )
            (cons 300 "Book"   )
            (cons 300 "Page"   )
            (cons 300 "N/A"      )
            (cons 300 "Lot"         )
            (cons 300 "Map"         )
            (cons 300 "Area"   )
            (cons 300 "Block"    )
            (cons 300 "Unit"   )
            (cons 301 "Prev CA "    )
            (cons 301 "CA2012..."   )
            (cons 301 "Yes"      )
            (cons 302 "No"       )
            (cons 303 "No"       )
            (cons 304 "No"       )
            )
   );setq
   );if

;(setq DATA_VARS "LDATA_VARS")
;   (New_Xrecord "LDATA_VARS")

(if (= DATA_VARS "ODATA_VARS" )
   (setq Values(list(cons 0 "XRECORD")    ; used for Lot Owner File in "XRECORDS"
            (cons 100"AcDbXrecord")
            (cons 3 "Septic Assistant")
            (cons 300 "O-Name"    )
            (cons 300 "O-Street"    )
            (cons 300 "O-State"   )
            (cons 300 "O-Town"   )
            (cons 300 "O-Zip"      )
            (cons 300 "O-Phone"   )
            (cons 300 "O-Email"   )
            (cons 301 "A-Name"    )
            (cons 301 "A-Street"    )
            (cons 301 "A-Town"    )
            (cons 301 "A-State"    )
            (cons 301 "A-Zip"    )
            (cons 301 "A-Phone"    )
            (cons 301 "A-Email"    )
            (cons 302 "Site Street"    )
            (cons 302 "Sub-Name"    )
            (cons 302 "SA2012..."    )
            )
   );setq
   );if
(if (= (GM_Xrecord DATA_VARS) nil)
   (progn
   (Alert (strcat "\nThe xRecord < " DATA_VARS " > was not Created"
            "\n"
            "\nThe likely cause, there where no <Values> variables")
      )
   (exit)
   )
   );if
T
);defun


;(New_Xrecord "EDATA_VARS") Example Calling line                        ;
;                                                ;
;============================End < New XRecord > Function ====================================;

BIGAL 发表于 2022-7-5 23:34:29

这些是有限的,可以由第三部分软件更改,但可能有用
 
用户I1。。。用户I5 5整数
用户1。。。用户5个字符串
用户1。。。用户5 5 reals
 
就我个人而言,我现在会使用扩展数据

MJLM 发表于 2022-7-5 23:34:47

 
 
 
我在afralisp网站上找到了类似的东西。我也试过你的代码。然而,尽管我没有做任何更改,但在执行(Append\u Xrecord“EDATA\u VARS”45 0.0)命令时,这两个参数都为零。我首先运行了一个新的绘图(GM\u Xrecord“EDATA\u VARS”)函数。有什么想法吗?

MJLM 发表于 2022-7-5 23:41:21

 
 
是的,但据我所知,扩展数据总是附加到一个实体。我发现全局参数/设置不实用。
页: [1] 2
查看完整版本: 保存全局变量值