乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
楼主: mwade93

[编程交流] 条件块插入

[复制链接]

9

主题

55

帖子

47

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-5 17:21:50 | 显示全部楼层
所以如果我想在这里添加设置变量,我会在哪里/怎么做?我尝试了一下,但设置ORN变量后代码停止了。
 
  1. (defun c:GT ()
  2. (setq CL (getvar "CLAYER"))
  3. (setq MFR "GLASTENDER")
  4. (setq MODEL "CBA-36L")
  5. (setq ORN (getstring "Enter Orientation [PLAN / ELEV / SIDE / 3D]:"))
  6. (setq MFRMODEL (strcat MFR "_" MODEL "_" ORN))
  7.    (lambda ( nbnm obnm nlyr olyr cmd )
  8.        (cond
  9.              ((not (tblsearch "LAYER" nlyr)) (princ (strcat "\nLayer "" nlyr "" does not exist.")))
  10.              ((not olyr) (princ "\nInvalid "CL" symbol.") )
  11.              ((not (tblsearch "LAYER" olyr)) (princ (strcat "\nLayer "" olyr "" does not exist.")))
  12.              (
  13.                (setvar 'cmdecho 0)(setvar 'clayer nlyr)
  14.                (cond
  15.                      ((not nbnm) (princ "\nInvalid "MFRMODEL" symbol.") )
  16.                      ((tblsearch "BLOCK" nbnm) (not (command "_.INSERT" nbnm "\" "1" "1" "\")) )
  17.                      ((not obnm) (princ "\nInvalid "ORN" symbol.") )
  18.                      ((not (tblsearch "BLOCK" obnm)) (princ (strcat "\nBlock "" obnm "" does not exist.")) )
  19.                      (T (not (command "_.INSERT" obnm "\" "1" "1" "\")) (command "_.RENAME" "block" obnm nbnm) )
  20.            )
  21.                (setvar 'clayer olyr)(setvar 'cmdecho cmd)
  22.            )
  23.        )
  24.            (princ)
  25.      )
  26.    (if (and (eq 'STR (type MFRMODEL)) (snvalid MFRMODEL)) MFRMODEL)
  27.    (cdr (assoc ORN '(("PLAN" . "GTC005P") ("ELEV" . "GTC005E") ("SIDE" . "GTJ011S") ("3D" . "GTC0053"))))
  28.    "QF-EQPM"
  29.    (if (and (eq 'STR (type CL)) (snvalid CL)) CL)
  30.    (getvar 'cmdecho)
  31. )
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 17:28:21 | 显示全部楼层
代码中的问题是,在为ORN符号设置引号时,使用了getstring而不是getkword。
此外,还必须使用initget预定义getkword的选项。
另一个非常重要的问题是你没有本地化你的变量。
因此,使用创建基本例程的经典方法简单地开始:
  1. (defun c:GT ( / CL MFR MODEL ORN MFRMODEL ) [color="green"]; Localise your variables (important)[/color]
  2. [color="green"]  ; Declare the initial variables:[/color]
  3. (setq CL (getvar "CLAYER"))
  4. (setq MFR "GLASTENDER")
  5. (setq MODEL "CBA-36L")
  6. (initget "Plan Elev Side 3D")
  7. (if (setq ORN (getkword "Enter Orientation [Plan/Elev/Side/3D]:")) [color="green"]; get user input(s)[/color]
  8.    (progn [color="green"]; if the user input(s) are correct, proceed...[/color]
  9.      (setq MFRMODEL (strcat MFR "_" MODEL "_" ORN))
  10.      ; ...
  11.    )[color="green"]; progn[/color]
  12. )[color="green"]; if[/color]
  13. )[color="green"]; defun [/color]

就像我的国家说的那样:我认为你是“把马车放在马的前面”。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:31:39 | 显示全部楼层
 
此外,FWIW注意到setq函数的命名是因为它是以下任一函数的收缩:
  1. (set (quote var) value)
  2. (set 'var value)

因此,该函数不是“设置引号”,而是为符号赋值(引号/撇号只是为了防止第一个参数被计算,从而作为符号提供)。
 
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 17:35:18 | 显示全部楼层
谢谢李,
我知道setq函数为什么这样命名。
事实上,我解释得很糟糕(解释东西不是我最好的方式)。
 
为了我自己的理解,我将详细说明(如果不是为任何人,至少为我自己)指定的符号成为代码变量:
  1. _$ (boundp 'a)
  2. nil
  3. _$ (set 'a "something")
  4. "something"
  5. _$ (boundp 'a)
  6. T
  7. _$

至少我将变量分类如下:
[列表]
  • 代码变量-(set/setq中使用的符号)
  • 系统变量-(setvar/getvar中使用的符号,即:“osmode”cmdecho)
    [/列表]
     
     
    我从中得出的结论是,引号/撇号用于取消评估内容,基本上两者(引号/撇号)没有任何不同:
    1. _$ (mapcar
    2. (quote (lambda (x) (strcat (strcase x) (strcase x t))))
    3. (quote ("A" "B" "C" "D" "E"))
    4. )
    5. ("Aa" "Bb" "Cc" "Dd" "Ee")
    6. _$

     
    我真的很感谢你的意见!
  • 回复

    使用道具 举报

    9

    主题

    55

    帖子

    47

    银币

    初来乍到

    Rank: 1

    铜币
    45
    发表于 2022-7-5 17:38:23 | 显示全部楼层
    我尝试将代码与建议一起使用,但在选择了ORN变量后,代码仍会暂停。
     
    1. (defun c:GT ( / CL MFR MODEL ORN MFRMODEL ) ; Localise your variables (important)
    2. ; Declare the initial variables:
    3. (setq CL (getvar "CLAYER"))
    4. (setq MFR "GLASTENDER")
    5. (setq MODEL "CBA-36L")
    6. (initget "Plan Elev Side 3D")
    7. (if (setq ORN (getkword "Enter Orientation [PLAN/ELEV/SIDE/3D]:")) ; get user input(s)
    8.    (progn ; if the user input(s) are correct, proceed...
    9.      (setq MFRMODEL (strcat MFR "_" MODEL "_" ORN))
    10.      ; ...
    11.    ); progn
    12. ); if
    13. (lambda ( nbnm obnm nlyr olyr cmd )
    14.    (cond
    15.      ( (not (tblsearch "LAYER" nlyr)) (princ (strcat "\nLayer "" nlyr "" does not exist.")) )
    16.      ( (not olyr) (princ "\nInvalid "CL" symbol.") )
    17.      ( (not (tblsearch "LAYER" olyr)) (princ (strcat "\nLayer "" olyr "" does not exist.")) )
    18.      (
    19.        (setvar 'cmdecho 0)(setvar 'clayer nlyr)
    20.        (cond
    21.          ( (not nbnm) (princ "\nInvalid "MFRMODEL" symbol.") )
    22.          ( (tblsearch "BLOCK" nbnm) (not (command "_.INSERT" nbnm "\" "1" "1" "\")) )
    23.          ( (not obnm) (princ "\nInvalid "ORN" symbol.") )
    24.          ( (not (tblsearch "BLOCK" obnm)) (princ (strcat "\nBlock "" obnm "" does not exist.")) )
    25.          (T (not (command "_.INSERT" obnm "\" "1" "1" "\")) (command "_.RENAME" "block" obnm nbnm) )
    26.        )
    27.        (setvar 'clayer olyr)(setvar 'cmdecho cmd)
    28.      )
    29.    )
    30.    (princ)
    31. )
    32. (if (and (eq 'STR (type MFRMODEL)) (snvalid MFRMODEL)) MFRMODEL)
    33. (cdr (assoc ORN '(("PLAN" . "GTC005P") ("ELEV" . "GTC005E") ("SIDE" . "GTJ011S") ("3D" . "GTC0053"))))
    34. "QF-EQPM"
    35. (if (and (eq 'STR (type CL)) (snvalid CL)) CL)
    36. (getvar 'cmdecho)
    37. )

     
    回复

    使用道具 举报

    66

    主题

    1552

    帖子

    1514

    银币

    后起之秀

    Rank: 20Rank: 20Rank: 20Rank: 20

    铜币
    325
    发表于 2022-7-5 17:43:54 | 显示全部楼层
    你看过代码中的注释了吗?
    这个lambda必须在progn块中使用,您只是将它复制到我提出的基本结构下面,并删除了语法,因此它不会进行计算。
    无论如何FWIW:
    1. (defun C:GT ( / MFR MODEL nlyr olyr cmd vb MFRMODEL ) ; always localise your variables (unless you know what you're doing)
    2. (if ; main (if) function: (if <User Inputs> <Code do its stuff> <Else print whats wrong>)
    3.    (setq ; Declare the initial variables (assign value to each symbol):
    4.      MFR "GLASTENDER"
    5.      MODEL "CBA-36L"
    6.      nlyr "QF-EQPM"
    7.      olyr (getvar 'clayer)
    8.      cmd (getvar 'cmdecho)
    9.      vb ; get user input (find the orientation and the corresponding block)
    10.      (assoc  
    11.        (progn
    12.          (initget "Plan Elev Side 3D")
    13.          (getkword "Enter Orientation [Plan/Elev/Side/3D]:")
    14.        )
    15.        '(("Plan" . "GTC005P") ("Elev" . "GTC005E") ("Side" . "GTJ011S") ("3D" . "GTC0053"))
    16.      ); assoc
    17.    ); setq
    18.    (progn ; if the user input are correct, proceed...
    19.      (setq MFRMODEL (strcat MFR "_" MODEL "_" (strcase (car vb)))) ; assemble the total name
    20.      (setvar 'cmdecho 0) (if (tblsearch "LAYER" nlyr) (setvar 'clayer nlyr)) ; temporarily change system variables
    21.      (cond
    22.        ( (tblsearch "BLOCK" MFRMODEL) ; if such block exist
    23.          (command "_.INSERT" MFRMODEL "\" "1" "1" "\") ; prompt the user to inser it and exit
    24.        )
    25.        ( (tblsearch "BLOCK" (cdr vb)) ; if MFRMODEL block do not exist, check if a corrseponding block exist
    26.          (and
    27.            (not (command "_.INSERT" (cdr vb) "\" "1" "1" "\")) ; if a corresponding block exist, prompt to insert it
    28.            (not (command "_.RENAME" "block" (cdr vb) MFRMODEL)) ; if the block is inserted, rename it
    29.          )
    30.        )
    31.        ( (princ (strcat "\nBlocks "" MFRMODEL "" and "" (cdr vb) "" were not found.")) ) ; if none of the blocks were found, display this message
    32.      )
    33.      (setvar 'clayer olyr)(setvar 'cmdecho cmd) ; restore the system variables
    34.    ); progn
    35.    (princ "\nOrientation was not specified.") ; print what went wrong
    36. ); if
    37. (princ) ; exit cleanly
    38. ); defun
    回复

    使用道具 举报

    9

    主题

    55

    帖子

    47

    银币

    初来乍到

    Rank: 1

    铜币
    45
    发表于 2022-7-5 17:47:55 | 显示全部楼层
    我把它插到了几个不同的地方,但都没用。只是尝试使用这个版本,它说,块没有找到。它不应该找到重命名的,因为它第一次不存在。但是,它也找不到文件夹中的DWG。
     
    如果块已在图形中,则此操作非常有效。
     
    回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    • 微信公众平台

    • 扫描访问手机版

    • 点击图片下载手机App

    QQ|关于我们|小黑屋|乐筑天下 繁体中文

    GMT+8, 2025-3-13 13:40 , Processed in 0.526737 second(s), 64 queries .

    © 2020-2025 乐筑天下

    联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表