LibertyOne 发表于 2022-7-6 06:29:32

关联列表或外部f

存储需要不断访问的数据的更好方法是什么?在关联列表中还是在文件中?
对此有什么想法吗?请分享你的经验。。。

Tharwat 发表于 2022-7-6 06:42:40

我认为这取决于数据。那么你在说什么样的数据呢?

LibertyOne 发表于 2022-7-6 06:53:02

我有很多事情。。。
 
例如:钢筋尺寸、横切面积、重量和库存属性表(交付方式,钢筋或盘绕)
 
我昨晚写了这个:
;; A-List for Stabstahl
;; (Nenndurchmesser ds Nennquerschnittsfläche As Nenngewicht Betonstabstahl Betonstahl in Ringen )

(setq *stabstahl*
   (list
       (list 6.0 0.283 0.222 T T)
       (list 8.0 0.503 0.395 T T)
       (list 10.0 0.785 0.617 T T)
       (list 12.0 1.131 0.888 T T)
       (list 14.0 1.54 1.21 T T)
       (list 16.0 2.01 1.58 T nil)
       (list 20.0 3.14 2.47 T nil)
       (list 25.0 4.91 3.85 T nil)
       (list 28.0 6.16 4.83 T nil)
       (list 32.0 8.04 6.31 T nil)
       (list 40.0 12.57 9.86 T nil)
   )
)

 
我想把这本小册子中的其他表格翻译成AutoLisp(共12张)。我的直觉是,对于这种工作,关联列表是最好的,因为表不仅仅是一个大小列表。许多因素决定了从表中选择什么,这些决定大多是在你的脑海中做出的,因为你马上知道你正在使用的混凝土的强度,或者混凝土部分将暴露在什么类型的气候中。
 
但我还没有被说服。我不想让我的程序陷入数据泥潭。

LibertyOne 发表于 2022-7-6 07:07:02

甚至写了一些表达式来提取数据。。。
 
一根20mm的钢筋每米的重量是多少?
(caddr (assoc 20.0 *stabstahl*))
-->2.47千克
 
16mm钢筋在环中可用吗?
(last (assoc 16.0 *stabstahl*))
-->零
 
5个28毫米钢筋的面积是多少?
(* 5 (cadr (assoc 28.0 *stabstahl*)))
-->30.8厘米2
 
8mm钢筋8.5m和14mm钢筋16m的总重量是多少?
(+
   (* 8.5 (caddr (assoc 8.0 *stabstahl*))) ;3.3575
   (* 16.0 (caddr (assoc 14.0 *stabstahl*))) ;19.36
)
-->22.7175千克

alanjt 发表于 2022-7-6 07:16:13

如果你想从许多不同的程序中引用一系列列表,我会将列表单独保存。LSP文件,并将其与您的acaddoc一起加载。LSP。这样就没有数据转换,只有一个全局变量,您可以从中引用。

您可以将其编码为assoc替换子程序。不要说(*5(cadr(assoc 28.0*stabstahl*)),而是说(*5(cadr(\u thisIsMyCompanyListRoutine 28.0)))。

Lee Mac 发表于 2022-7-6 07:28:19

我同意Alan关于保留使用AutoLISP列表存储数据的建议;将数据存储在分隔文件中需要对字符串数据进行额外的解析和转换处理,然后才能供程序使用。
 
如果数据结构相当复杂,我可能会选择使用XML文件,然后可以使用MSXML的方法查询该文件。DOMDocument对象,但对于简单的列表,这不是必需的。
 
我唯一的其他建议是在可能的情况下引用文字数据,以避免计算多余的表达式,例如,您发布的列表:
 
(setq *stabstahl*
   (list
       (list 6.0 0.283 0.222 T T)
       (list 8.0 0.503 0.395 T T)
       (list 10.0 0.785 0.617 T T)
       (list 12.0 1.131 0.888 T T)
       (list 14.0 1.54 1.21 T T)
       (list 16.0 2.01 1.58 T nil)
       (list 20.0 3.14 2.47 T nil)
       (list 25.0 4.91 3.85 T nil)
       (list 28.0 6.16 4.83 T nil)
       (list 32.0 8.04 6.31 T nil)
       (list 40.0 12.57 9.86 T nil)
   )
)将成为:
(setq *stabstahl*
'(
       ( 6.00.283 0.222 tt )
       ( 8.00.503 0.395 tt )
       (10.00.785 0.617 tt )
       (12.01.131 0.888 tt )
       (14.01.541.21tt )
       (16.02.011.58t nil)
       (20.03.142.47t nil)
       (25.04.913.85t nil)
       (28.06.164.83t nil)
       (32.08.046.31t nil)
       (40.0 12.579.86t nil)
   )
)

LibertyOne 发表于 2022-7-6 07:38:37

 
我还编写了以下代码,以更轻松地提取数据:
 
(defun rebar-area (/ ds)
   (cadr (assoc ds *stabstahl*))
)

(defun rebar-weight (/ ds)
   (caddr (assoc ds *stabstahl*))
)

(defun rebar-bar (/ ds)
   (cadddr (assoc ds *stabstahl*))
)

(defun rebar-ring (/ ds)
   (last (assoc ds *stabstahl*))
)
谢谢你的提示,李。。。我打赌这会缩短评估时间。
页: [1]
查看完整版本: 关联列表或外部f