环虽然
我想我知道我需要“while”,但不知道该放在哪里,也不知道我错过了什么。我试了几个地方,但似乎什么都不对。我查看了所有其他帖子和网站。我理解它的功能,但我一定没有正确使用它。我希望它重复绘图并标记梁,直到我退出。;Version 1.02
(defun C:bd(/ width depth membr suffix suffixs prx tsz dpth wdth label label2 label1)
(setq lsttsz ' ("11x17" "24x36")
lstmembr '("Flush Beam" "Header/Drop Beam")
lstprx '("1 ply" "2 ply" "3 ply")
lstwidth '("1.5" "1.75" "3" "3.5" "4.5" "5.25" "7" "2.5")
lstdepth '("5.5" "6" "7.25" "8" "9.25" "9.5" "10" "11.25" "11.875" "12" "14" "16" "18" "24")
lstsuffix '("PSL" "LVL" "LSL")
lstsuffixs '("FRB" "UWA" "UCA" "nothing"));end setq
(or tsz (setq tsz (car lsttsz)))
(or membr (setq membr (car lstmembr)))
(or prx (setq prx (car lstprx)))
(or width (setq width (car lstWidth)))
(or depth (setq depth (car lstDepth)))
(or suffix (setq suffix (car lstsuffix)))
(or suffixs (setq suffixs (car lstsuffixs)))
(setq dcl_id (load_dialog "beam.dcl"))
(if (not (new_dialog "beam" dcl_id)) (exit))
(progn
(set_tile tsz "1")
(set_tile membr "1")
(set_tile prx "1")
(set_tile width "1")
(set_tile depth "1")
(set_tile suffix "1")
(set_tile suffixs "1")
(action_tile "tsz" "(setq tsz $value)")
(action_tile "membr" "(setq membr $value)")
(action_tile "prx" "(setq prx $value)")
(action_tile "width" "(setq width $value)")
(action_tile "depth" "(setq depth $value)")
(action_tile "suffix" "(setq suffix $value)")
(action_tile "suffixs" "(setq suffixs $value)"));end progn
(start_dialog)
(unload_dialog dcl_id)
;;;----set variables -------------------------------------
;(setvar expert 1)
(setq layerset (getvar "clayer")
orthoset (getvar "orthomode")
polyset(getvar "plinewid")
);setq
;------------What size text for border-------------------
(if(= tsz "11x17") (setq tsz1 "6"))
(if(= tsz "24x36")(setq tsz1 "4.5"))
;------------Which layer it draws the beam on-------------------
(if(= membr "Flush Beam") (setq layer_name "S-FRM-BEAM"))
(if(= membr "Header/Drop Beam")(setq layer_name "S-FRM-HEADER"))
(command "expert" "1" "")
;-------------Creat layers for beam-------------------------------
(command "_.layer" "M" layer_name "c" "12" layer_name "S" layer_name "")
;-----------------draw beams -------------------------
(command "pline" pause "w" width width pause "")
;----------change thickness of polyline----------------
(command "chprop" "l" "" "t" depth "")
;----------change text size and style-------------------
(command "textsize" tsz1 "")
(command "_.style" "romans" "romans" "0" "0.80" "" "" "" "")
;-------------Creat layers for text-------------------------------
(command "_.layer" "M" "S-ANNO-TEXT" "c" "1" "S-ANNO-TEXT" "S" "S-ANNO-TEXT" "")
(and (setq ss (ssget "L" '((0 . "*polyline"))))
(while (setq en (ssname ss 0))
(setq ed (entget en))
(setq p10 (cdr (assoc 10 ed)))
(setq p9 (reverse ed))
(setq p11 (cdr (assoc 10 p9)))
(setq mpt (mapcar '(lambda (a b) (* (+ a b) 0.5)) p10 p11))
(setq ltype (cdr (cond
((assoc 6 ed)))))
(setq dpth (cdr (cond
((assoc 39 ed)))))
(setq wdth (cdr (cond
((assoc 40 ed)))))
;---------How many plys the member has----------
(cond
((= prx "1 ply") (and (< width "1.75")(setq label2 "")))
((= prx "2 ply")(setq label2 "2~"))
((= prx "3 ply")(setq label2 "3~")));end cond
;----------Width of the member---------
(cond
((= wdth 1.5)(setq label "2x"
suffix ""))
((= wdth 1.75)(setq label "1.75x"))
((= wdth 2.5)(setq label "I-JOIST/BEAM"
label2 ""
dpth 0
suffix ""))
((= wdth 3)(setq label "2x"
suffix "" ))
((= wdth 3.5)(setq label "3.5x"
label2 ""))
((= wdth 4.5)(setq label "2x"
suffix ""))
((= wdth 5.25)(setq label "5.25x"
label2 ""))
((= wdth 7)(setq label "7x"
label2 "")));end cond
;----------Depth of the Member-------------
(cond
((= dpth 5.5)(setq label1 (rtos dpth 2 1)))
((= dpth 6)(setq label1 (rtos dpth 2 0)))
((= dpth 7.25)(setq label1 (rtos dpth 2 2)))
((= dpth 9.25)(setq label1 (rtos dpth 2 2)))
((= dpth 9.5)(setq label1 (rtos dpth 2 1)))
((= dpth (setq label1 (rtos dpth 2 0)))
((= dpth 10)(setq label1 (rtos dpth 2 0)))
((= dpth 11.25)(setq label1 (rtos dpth 2 2)))
((= dpth 12)(setq label1 (rtos dpth 2 0)))
((= dpth 11.875)(setq label1 (rtos dpth 2 3)))
((= dpth 14)(setq label1 (rtos dpth 2 0)))
((= dpth 16)(setq label1 (rtos dpth 2 0)))
((= dpth 18)(setq label1 (rtos dpth 2 0)))
((= dpth 24)(setq label1 (rtos dpth 2 0)))
((= dpth 0)(setq label1 "")));end cond
(defun radians->degrees (r)(cvunit r "radian" "degree"))
;-------TEXT JUSTIFICATION----------------------------------------
(setq lan (angle p10 p11))
(setq ad (radians->degrees lan))
(if (and (> ad 90.1) (<= ad 270.1))
(progn
(setq ptemp p10
p10 p11
p11 ptemp
lan (angle p10 p11)
ad (radians->degrees lan))))
(setq dir (if (< (* pi 0.5) lan (* pi 1.5)) - +))
(setq r3(entmake (list (cons 0 "TEXT")
(cons 8 (getvar "CLAYER"))
(cons 7 (getvar "TEXTSTYLE"))
(cons 40 (getvar "TEXTSIZE"))
(cons 41 0.80)
(cons 72 4)
(setq fg(cons 10 ' (0.0 0.0)));(setq r1(polar mpt (dir lan (+ 1))
;(getvar "TEXTSIZE")))))
(setq hg(cons 11 (setq r2(polar mpt (dir lan (* 0.5 pi));(+ 1))
(+ (* 0.5 (atof width)) (* 0.8 (getvar "TEXTSIZE")))))))
(setq gg(cons 50 lan))
(setq rg(cons 1 (strcat label2 label label1 suffix suffixs))))))
(ssdel en ss)))
;---------------------reset vars-----------
(setvar "clayer" layerset)
(setvar "orthomode" orthoset)
(setvar "plinewid"polyset)
(command "expert" "0" "")
(princ)
)
beam : dialog {
label = "Pick a Member";
: row {
: boxed_radio_row {key = "tsz";
label = "Text Size";
: radio_button {
label = "11x17";
key = "11x17";
}
: radio_button {
label = "24x36";
key = "24x36";
}}}
: row {
: boxed_radio_row {key = "membr";
label = "Member";
: radio_button {
label = "Flush Beam";
key = "Flush Beam";
}
: radio_button {
label = "Header/Drop Beam";
key = "Header/Drop Beam";
}}}
: row {
: boxed_radio_row {key = "prx";
label = "Preffix";
: radio_button {
label = "1 Ply";
key = "1 ply";
}
: radio_button {
label = "2 Ply";
key = "2 ply";
}
: radio_button {
label = "3 Ply";
key = "3 ply";
}}}
: row {
: boxed_radio_row {key = "width";
label = "Width";
: radio_button {
label = "1.5 (SGL 2x)";
key = "1.5";
}
: radio_button {
label = "1.75";
key = "1.75";
}
: radio_button {
label = "3 (DBL 2x)";
key = "3";
}
: radio_button {
label = "3.5";
key = "3.5";
}
: radio_button {
label = "4.5 (TPL 2x)";
key = "4.5";
}
: radio_button {
label = "5.25";
key = "5.25";
}
: radio_button {
label = "7";
key = "7";
}
: radio_button {
label = "I-JOIST/BEAM";
key = "2.5";
}}}
: row {
: boxed_radio_row {key = "depth";
label = "Depth";
: radio_button {
label = "5.5";
key = "5.5";
}
: radio_button {
label = "2x6";
key = "6";
}
: radio_button {
label = "7.25";
key = "7.25";
}
: radio_button {
label = "2x8";
key = "8";
}
: radio_button {
label = "9.25";
key = "9.25";
}
: radio_button {
label = "9.5";
key = "9.5";
}
: radio_button {
label = "2x10";
key = "10";
}
: radio_button {
label = "11.25";
key = "11.25";
}
: radio_button {
label = "11.875";
key = "11.875";
}
: radio_button {
label = "2x12";
key = "12";
}
: radio_button {
label = "14";
key = "14";
}
: radio_button {
label = "16";
key = "16";
}
: radio_button {
label = "18";
key = "18";
}
: radio_button {
label = "24";
key = "24";
}}}
: row {
: boxed_radio_row {key = "suffix";
label = "Suffix";
: radio_button {
label = "PSL";
key = " PSL";
}
: radio_button {
label = "LVL";
key = " LVL";
}
: radio_button {
label = "LSL";
key = " LSL";
}
}}
: row {
: boxed_radio_row {key = "suffixs";
label = "Suffixs";
: radio_button {
label = "FRB";
key = " FRB";
}
: radio_button {
label = "UWA";
key = " UWA";
}
: radio_button {
label = "UCA";
key = " UCA";
}
: radio_button {
label = "NOTHING";
key = "";
}
}}
: row {
: button {
label = "&OK";
key = "accept";
fixed_width = true;
is_default = true;
alignment = centered;
}
: button {
label = "&Cancel";
key = "cancel";
fixed_width = true;
is_cancel = true;
alignment = centered;
}}
: paragraph {
:text_part {
label = "PTS Inc.";
alignment = centered;
}
:text_part {
label = "Version 1.02";
alignment = centered;
}}
} 我对此不太确定。while基本上具有这样的结构:(while condition
operation1
operation2
...
operationN
)如果条件返回除nil以外的任何值,则所有操作都将运行。只有当条件=nil时,循环才会停止。
在你的例子中,我认为条件永远不会返回nil,因此循环永远不会结束。我认为问题是你总是从选择集中提取第一个项目。您应该使用一个计数器变量来提取next,然后提取next,等等,直到没有更多,并且ssname-->nil-->停止while。 在底部,他/她有:
然而,这是一种在选择集上迭代的非常低效的方法,因为必须为处理的每个实体更新所有剩余实体的索引。 哦凹痕让我有点不舒服。我没有数一数所有的括号来计算循环的开始和停止位置,所以当我没有看到它在我预期的位置时,我认为这就是问题所在。
无论如何,更清楚一点OP想要什么:你想每次打开对话框直到你点击取消按钮吗?然后,您可能需要从start\u对话框调用中获取返回值,并检查是否为1-可能会将其添加到while循环的条件部分(将unload\u对话框移到末尾右侧的外侧),然后围绕其他所有内容继续while循环,直到重置变量之前。
顺便说一句,您可能需要研究错误处理,因为您正在设置一些sysvars。尤其是当你要按Esc键来“停止”这个程序时。 Irnbe,
我希望盒子不要再出现。只需继续绘制和标记梁。
李,
我在这方面是新手,所以我从这个论坛的其他人那里获得了一部分代码。我请求帮助对一条线的长度进行多重标记。所以有没有办法做到这一点,并改变这一部分。你有没有办法向我解释一下,这样我就可以自己动手学习了,还是打字太多了?我希望有一天我能来这里帮助别人,而不是寻求帮助。在我来寻求帮助之前,我试着自己做了几天。我正在尽我所能寻找新的阅读和学习材料。像你的网站,这个论坛帖子,其他论坛,其他人的网站和书籍。
谢谢你们的信息,我会继续寻找另一种方式。
我也是一个他。英雄联盟
有几种方法可以迭代选择集中的所有对象,一些方法更直观,其他方法更有效。
下面我将提供一些示例来演示各种不同的方法,并尽我所能简要解释每种方法的工作原理及其操作效率。
因此,我提出:
选择集处理简介。。。
作者:Lee Mac
在以下所有示例中,将提示用户选择对象,示例程序将迭代选择集,打印每个实体的实体类型(或在Visual LISP示例中为VLA对象的对象名称)。
为了简单易读,许多示例已扩展为使用多个变量,随后可以通过嵌套表达式缩短,但这不是本教程的目的。
方法1:while
以下函数使用while循环在选择集上迭代。计数器变量i初始化为0,限制变量n设置为选择集的大小。
如果计数器小于集合中的项数,则while循环的测试条件将评估为T。
然后,计数器变量在while循环中顺序递增,确保在处理完所有实体后循环终止。
注意,所有选择集都有一个从零开始的索引,因此选择中的第一个实体位于索引0,最后一个实体位于索引sslength-1
(defun c:test1 ( / e i n s x )
(if (setq s (ssget))
(progn
(setq i 0
n (sslength s)
)
(while (< i n)
(setq e (ssname s i)
x (cdr (assoc 0 (entget e)))
i (1+ i)
)
(print x)
)
)
)
(princ)
)
5 看了这个,你知道怎么用我的Lisp程序吗?我一直在尝试不同的事情,但没有成功。 Great explanations indeed ,
I wish I had seen explanations like this before , before I had to push my self so hard to know how things are running Thanks Tharwat, glad it helps!
页:
[1]
2