au-s 发表于 2022-7-6 11:43:07

选择文字比例

你好
 
我一直在试着完成一个lisp,它告诉我选择我想要键入文本的比例。
所以,如果我选择以特定的比例键入文本(dtext),我会得到一定的高度。
 
当我运行命令时,我得到“nil”。
 
怎么了?
 
这能以其他方式完成吗?也许有一个更方便用户使用的弹出列表,在这个弹出列表中有不同的比例。
 
 
这是lisp:
如何添加用户正在选择的比例因子ie 1:12
新层应适用于用户选择的比例A-----T1-----X
是否完成了:
(setq TextScale(*3.2斯卡拉))

Commandobill 发表于 2022-7-6 11:51:25

嗯,我想首先要做的事。
 
(setq skala (getkword "\nChoose scale : "))
(cond
((= scale "1") (setq new_layer "A-------T1-------A" new_txtsize 3.2))
((= scale "2") (setq new_layer "A-------T1-------J" new_txtsize 6.4))
((= scale "5") (setq new_layer "A-------T1-------J" new_txtsize 16.0))
((= scale "10") (setq new_layer "A-------T1-------C" new_txtsize 32.0))
((= scale "20") (setq new_layer "A-------T1-------D" new_txtsize 64.0))
((= scale "50") (setq new_layer "A-------T1-------E" new_txtsize 175.0))
((= scale "100") (setq new_layerr "A-------T1-------F" new_txtsize 350.0))
((= scale "200") (setq new_layerr "A-------T1-------G" new_txtsize 700.0))
((= scale "400") (setq new_layer "A-------T1-------K" new_txtsize 1400.0))
((= scale "500") (setq new_layer "A-------T1-------H" new_txtsize 1750.0))
((= scale "+500") (setq new_layer "A-------T1-------X" new_txtsize 3500.0))
)
 
您正在设置“skala”并检查“scale”

Lee Mac 发表于 2022-7-6 11:55:18

而且
 
[列表]
[*]您没有在任何地方设置层
[*]您正在使用(命令“_.dtext”,这可能非常不可预测,我会使用entmake或vla addtext。
[*]所有的initdia和filedia是什么?
[/列表]

au-s 发表于 2022-7-6 11:57:32


那只是我想做点什么
但我很欣赏小费

Lee Mac 发表于 2022-7-6 12:05:13

看看你是否可以从这里得到一些提示:
 

(defun c:test (/ Make_Text pt new_layer new_txtsize)

(defun Make_Text (pt str hgt lay)
   (entmakex (list (cons 0 "TEXT") (cons 8lay) (cons 40 hgt)
                   (cons 10 pt)    (cons 1str))))

(setq *scl* (cond (*scl*) ("10")))
(initget "1 2 10 20 50 100 200 400 500 +500")

(setq *scl* (cond ((getkword (strcat "\nChoose Scale <" *scl* "> : ")))
                   (*scl*)))

(if (setq pt (getpoint "\nSelect Point: "))
   (progn
   
   (cond ((= *scl* "1")    (setq new_layer "A-------T1-------A" new_txtsize 3.2))
         ((= *scl* "2")    (setq new_layer "A-------T1-------J" new_txtsize 6.4))
         ((= *scl* "5")    (setq new_layer "A-------T1-------J" new_txtsize 16.0))
         ((= *scl* "10")   (setq new_layer "A-------T1-------C" new_txtsize 32.0))
         ((= *scl* "20")   (setq new_layer "A-------T1-------D" new_txtsize 64.0))
         ((= *scl* "50")   (setq new_layer "A-------T1-------E" new_txtsize 175.0))
         ((= *scl* "100")(setq new_layer "A-------T1-------F" new_txtsize 350.0))
         ((= *scl* "200")(setq new_layer "A-------T1-------G" new_txtsize 700.0))
         ((= *scl* "400")(setq new_layer "A-------T1-------K" new_txtsize 1400.0))
         ((= *scl* "500")(setq new_layer "A-------T1-------H" new_txtsize 1750.0))
         ((= *scl* "+500") (setq new_layer "A-------T1-------X" new_txtsize 3500.0)))
   
   (Make_Text pt "This is a String" new_txtsize new_layer)))

(princ))

au-s 发表于 2022-7-6 12:08:10


 
Thanx。。。我想出了一个加载弹出菜单的想法。
 
这是修改后的lisp,请参见下文。尽管如此,当我从弹出菜单中选择比例时,我无法使其工作。如果我选择比例1:5,它实际上可以工作,但它选择了错误的文本高度。
为此,您需要安装DOSLib。
任何人
 
;if layout, stop the lisp and execute textheight 3.2mm

    (defun dtexttilemode1 ()
   (if (null (tblsearch "LAYER" "A-------T1-------A"))
   (command "_LAYER" "_N" "A-------T1-------A" "_C" 1 "A-------T1-------A" "")
)
(setvar "clayer" "A-------T1-------A")
   (command "_dtext" pt 3.2 "" "")
(setvar "clayer" oldlay)
)

;popupscale, choose which scale
(defun popupskaladtext (/ scl x)
(setq    x ( list "1:1" "1:2" "1:5" "1:10" "1:20" "1:50" "1:100" "1:200" "1:400" "1:500" "1:1000" "1:2000" )
         
   scl nil
   )

   (while (or (not scl) (= scl 0))
   (setq scl (dos_popupmenu x))
)
)
;main function
(defun c:TEXT (/ Make_Text pt new_layer new_txtsize oldlay scl x)
(setq oldlay (getvar "clayer"))
(setq pt (getpoint "\nChoose point: "))
   
(if (= (getvar "tilemode") 0)

(dtexttilemode1)
   
   (progn
   (popupskaladtext)
   
   (cond ((= scl 1)    (setq new_layer "A-------T1-------A" new_txtsize 3.2))
         ((= scl 2)    (setq new_layer "A-------T1-------J" new_txtsize 6.4))
         ((= scl 5)    (setq new_layer "A-------T1-------B" new_txtsize 16.0))
         ((= scl 10)   (setq new_layer "A-------T1-------C" new_txtsize 32.0))
         ((= scl 20)   (setq new_layer "A-------T1-------D" new_txtsize 64.0))
         ((= scl 50)   (setq new_layer "A-------T1-------E" new_txtsize 160.0))
         ((= scl 100)(setq new_layer "A-------T1-------F" new_txtsize 320.0))
         ((= scl 200)(setq new_layer "A-------T1-------G" new_txtsize 640.0))
         ((= scl 400)(setq new_layer "A-------T1-------K" new_txtsize 1280.0))
         ((= scl 500)(setq new_layer "A-------T1-------H" new_txtsize 1600.0))
       ((= scl 1000) (setq new_layer "A-------T1-------X" new_txtsize 3200.0))
       ((= scl 2000) (setq new_layer "A-------T1------X2" new_txtsize 6400.0)))
   
(if (null (tblsearch "LAYER" new_layer))
   (command "_LAYER" "_N" new_layer "_C" 1 new_layer "")
)

(setvar "clayer" new_layer)
   (command "_dtext" pt new_txtsize "" "")
(setvar "clayer" oldlay)))
(princ)
)
 
隐马尔可夫模型。。。
可能我需要将“1:1”等转换为字符串?

Lee Mac 发表于 2022-7-6 12:14:20

 
看看我是如何创建示例中的文本的。

au-s 发表于 2022-7-6 12:16:40

我认为这不是问题所在。
 
我现在正在试验lisp如何从列表x中读取比例。
 
所以我补充说
 
setq scldtext (substr scl 3))
 
我希望这意味着,从列表中,比例写为1,2,50,100等,没有“1:”。
 
但我还是有点搞错了:
 
(defun popupskaladtext ()
(setq    x ( list "" "1:1" "1:2" "1:5" "1:10" "1:20" "1:50" "1:100" "1:200" "1:400" "1:500" "1:1000" "1:2000" "" )
         
   scl nil
   )

   (while
   (or (not scl)
       (= 0 scl)
   ) ;_ or
    (setq scl (dos_popupmenu x))
) ;_ while
(setq scldtext (substr scl 3))

); end defun
 
这就是条件:
(cond ((= scldtext "1")       (setq new_layer "A-------T1-------A" new_txtsize 3.2))
         ((= scldtext "2")    (setq new_layer "A-------T1-------J" new_txtsize 6.4))
         ((= scldtext "5")    (setq new_layer "A-------T1-------B" new_txtsize 16.0))
         ((= scldtext "10")   (setq new_layer "A-------T1-------C" new_txtsize 32.0))
         ((= scldtext "20")   (setq new_layer "A-------T1-------D" new_txtsize 64.0))
         ((= scldtext "50")   (setq new_layer "A-------T1-------E" new_txtsize 160.0))
         ((= scldtext "100")(setq new_layer "A-------T1-------F" new_txtsize 320.0))
         ((= scldtext "200")(setq new_layer "A-------T1-------G" new_txtsize 640.0))
         ((= scldtext "400")(setq new_layer "A-------T1-------K" new_txtsize 1280.0))
         ((= scldtext "500")(setq new_layer "A-------T1-------H" new_txtsize 1600.0))
       ((= scldtext "1000") (setq new_layer "A-------T1-------X" new_txtsize 3200.0))
       ((= scldtext "2000") (setq new_layer "A-------T1------X2" new_txtsize 6400.0)))
 
尽管这是我在选择比例1:10时遇到的错误
错误:错误的参数类型:stringp 3
选择比例1:2将导致以下错误消息:
错误:错误的参数类型:stringp 1
 
等等等等。。。
 
我不知道substr是否正常。。。

au-s 发表于 2022-7-6 12:22:29

我用这个简单的东西做到了
 
;;;DESCRITION






;if layout, make the lisp write with the layer for 1:1

    (defun dtexttilemode1 ()
   (if (null (tblsearch "LAYER" "A-------T1-------A"))
   (command "_LAYER" "_N" "A-------T1-------A" "_C" 1 "A-------T1-------A" "")
)
(setvar "clayer" "A-------T1-------A")
   (command "_dtext" pt 3.2 "" "")
(setvar "clayer" oldlay)
)

;popupscale, choose which scale
(defun Popupskala1 ()
(setq popupskaladtext (dos_popupmenu '( "" "1:1" "1:2" "1:5" "1:10" "1:20" "1:50" "1:100" "1:200" "1:400" "1:500" "1:1000" "1:2000" "" )))
)


;main function
(defun c:test (/ pt new_layer new_txtsize oldlay scldtext scl_Text skala)
(setq oldlay (getvar "clayer"))
(setq pt (getpoint "\nVälj startpunkt: "))

   
(if (= (getvar "tilemode") 0)

(dtexttilemode1)
   
   (progn
   (Popupskala1)
   ;(setq scl_Text (atoi skala))
   
   (cond ((= popupskaladtext 0)    (setq new_layer "A-------T1-------A" new_txtsize 3.2))
         ((= popupskaladtext 1)    (setq new_layer "A-------T1-------J" new_txtsize 6.4))
         ((= popupskaladtext 2)    (setq new_layer "A-------T1-------B" new_txtsize 16.0))
         ((= popupskaladtext 3)   (setq new_layer "A-------T1-------C" new_txtsize 32.0))
         ((= popupskaladtext 4)   (setq new_layer "A-------T1-------D" new_txtsize 64.0))
         ((= popupskaladtext 5)   (setq new_layer "A-------T1-------E" new_txtsize 160.0))
         ((= popupskaladtext 6)(setq new_layer "A-------T1-------F" new_txtsize 320.0))
         ((= popupskaladtext 7)(setq new_layer "A-------T1-------G" new_txtsize 640.0))
         ((= popupskaladtext   (setq new_layer "A-------T1-------K" new_txtsize 1280.0))
         ((= popupskaladtext 9)(setq new_layer "A-------T1-------H" new_txtsize 1600.0))
       ((= popupskaladtext 10) (setq new_layer "A-------T1-------X" new_txtsize 3200.0))
       ((= popupskaladtext 11) (setq new_layer "A-------T1------X2" new_txtsize 6400.0)))
   
(if (null (tblsearch "LAYER" new_layer))
   (command "_LAYER" "_N" new_layer "_C" 1 new_layer "")
)

(setvar "clayer" new_layer)
   (command "_dtext" pt new_txtsize "" "")
(setvar "clayer" oldlay)))
(princ)
)

Lee Mac 发表于 2022-7-6 12:27:59

 
可能不是,但这是一种比使用_x更好的方法。dtext创建文本。众所周知,在不同的图形上使用dtext时不可靠。
页: [1] 2
查看完整版本: 选择文字比例