(getvar 'cannoscalevalue)
仅供参考:非本地化前缀('')仅在命令中需要。 在此版本之前,我确实使用了CANNOSCALEVALUE。这只返回了条件语句的最后一行,当我更改视口的比例,然后再次运行程序时,不会返回任何其他文本大小值。 根据您的代码,这里有两种选择:
(defun c:tsize ( / tsz )
(if
(setq tsz
(cdr
(assoc (/ 1.0 (getvar 'cannoscalevalue))
'(
(96.0 . 9.000)
(48.0 . 4.500)
(24.0 . 2.250)
(16.0 . 1.500)
(12.0 . 1.125)
(08.0 . 0.750)
)
)
)
)
(setvar 'textsize tsz)
)
(princ)
)
(defun c:tsize ( / )
(setvar 'textsize (/ 3.0 (* (getvar 'cannoscalevalue) 32.0)))
(princ)
)
然后,您可能需要调整正在测试的硬编码值(字符串)。。。我使用十进制,而不是上面看起来像建筑单位的东西。。。但对我来说,1“=20”(例如),当我使用(getvar‘cannoscale)时,实际上返回“1\”=20’”。 很好,李。 这是我的第一个版本。当我发现CANNOSCALEVALUE时得到的值是一个长的十进制数。我发现是分数形式的分数除以12。
(defun c:tsize (/ vps tsz)
(setq vps (getvar "_cannoscalevalue"))
(setq tsz (cond
((= vps "0.010417") 9.000)
((= vps "0.020833") 4.500)
((= vps "0.041667") 2.250)
((= vps "0.062500") 1.500)
((= vps "0.083333") 1.125)
((= vps "0.125000") 0.750)
(t nil)
)
)
(setvar "textsize" tsz)
(command "_regenall")
(princ)
)
您已经正确理解了CANNOSCALEVALUE系统变量持有双[实]数据类型的值,但您正在代码中比较条件语句中的字符串:
此外,如前所述,系统变量不需要下划线非本地化前缀:
我不确定我是否遵循了你的代码李中的几个项目。如果撇号(')应该表示一个列表,那么它是否也可以作为一种变量,您可以从中调用?我指的是:
(assoc (/ 1.0 (getvar 'cannoscalevalue))
'(
(96.0 . 9.000)
(48.0 . 4.500)
(24.0 . 2.250)
(16.0 . 1.500)
(12.0 . 1.125)
(08.0 . 0.750)
)
您还将撇号放在系统变量TEXTSIZE之前。它是否记得您使用CDR时列表中的第二个元素?
这有什么意义吗?
我会阻止你的
撇号并不表示列表。撇号(或引号)用于将表达式标记为文字-按“面值”取值-即不由AutoLISP解释器计算。
考虑以下示例:
这里,引用的整数列表相当于为列表函数提供5个整数参数。
再次,引用的列表结构在“面值”处被视为点对列表。如图所示,要使用AutoLISP函数构造此列表,需要将列表函数和cons函数相结合。
本例演示了“文字”和“面值”等术语的含义。
在这里,我们将符号x的值指定为4;在第一个表达式中,列表函数提供了4个参数:1、2、3和x。因此,变量x由列表函数求值,并返回列表(1、2、3、4)。
当列表被引用时,它被标记为文字,因此不进行评估;这导致符号x未被评估,并在列表中保留为符号。
然而,撇号或引号不仅仅用于列表,如以下示例所示:
此处,撇号用于将函数“+”标记为mapcar函数的参数,并且两个列表参数也被引用,因为它们不包含要计算的表达式。(考虑一下,如果未引用“+”函数,我们将收到“bad function”错误,因为计算“+”符号将返回指向其函数定义的指针)。
如果你厌恶撇号,上述内容可以等效为:
编译到VLX/FAS时,为了优化,可以使用函数:
关于getvar/setvar示例:使用撇号是因为getvar/setvar函数可以接受字符串或符号参数:
因此引用符号作为参数传递给getvar(或setvar)函数,而不是进行求值。
如上所述,也可以这样写:
请注意,如果未使用撇号,则表达式的计算公式为:
因为osmode符号在活动文档名称空间中没有值。
当然,我们可以给这个符号赋值(只是为了让你困惑):
15
干杯伙计
页:
1
[2]