Lee Mac 发表于 2022-7-6 06:47:35

您可能会发现使用CANNOSCALEVALUE系统变量更容易:
 
(getvar 'cannoscalevalue)
 
仅供参考:非本地化前缀('')仅在命令中需要。

ksperopoulos 发表于 2022-7-6 06:50:02

在此版本之前,我确实使用了CANNOSCALEVALUE。这只返回了条件语句的最后一行,当我更改视口的比例,然后再次运行程序时,不会返回任何其他文本大小值。

Lee Mac 发表于 2022-7-6 06:55:25

根据您的代码,这里有两种选择:
 
(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)
)

BlackBox 发表于 2022-7-6 06:57:24

 
然后,您可能需要调整正在测试的硬编码值(字符串)。。。我使用十进制,而不是上面看起来像建筑单位的东西。。。但对我来说,1“=20”(例如),当我使用(getvar‘cannoscale)时,实际上返回“1\”=20’”。

BlackBox 发表于 2022-7-6 06:59:45

很好,李。

ksperopoulos 发表于 2022-7-6 07:03:41

这是我的第一个版本。当我发现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)
)

Lee Mac 发表于 2022-7-6 07:07:56

 
您已经正确理解了CANNOSCALEVALUE系统变量持有双[实]数据类型的值,但您正在代码中比较条件语句中的字符串:
 
 
此外,如前所述,系统变量不需要下划线非本地化前缀:
 

ksperopoulos 发表于 2022-7-6 07:11:23

我不确定我是否遵循了你的代码李中的几个项目。如果撇号(')应该表示一个列表,那么它是否也可以作为一种变量,您可以从中调用?我指的是:
 
                (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时列表中的第二个元素?
 
这有什么意义吗?

Lee Mac 发表于 2022-7-6 07:14:22

 
我会阻止你的
 
撇号并不表示列表。撇号(或引号)用于将表达式标记为文字-按“面值”取值-即不由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

Lee Mac 发表于 2022-7-6 07:15:31

 
干杯伙计
页: 1 [2]
查看完整版本: 按VP比例设置文本大小