作图03,求a=2b
直线分段方式,a=a=2b呵呵,小学生的计算题也来了。 眼睛数花了。。。 不是很明白楼主的意思,如果是要画出那个图的话,先画出一个其它的用阵列就可以啦。 按要求做出,然后缩放到3500即可吧,那个花纹倒是个难题。
原意是这样的
主要是求画栏杆的间距,间距是A、B两种,A=2B,由14*14的方钢分隔,A+A+B相接,A一般不超过130,长度不一定是3500,可以是任何长度,到最后能尽分(即是没有余数),这是在设计围栏工作中经常遇到的,花形不用理会还有
不论总长度如何,分出多小间隔,A的距离=B的距离*2,14*14的方钢尺寸是不能改变的 原帖由 mice 于 2010-6-24 14:37 发表 http://www.askcad.com/bbs/images/common/back.gif直线分段方式,a=a=2b
距离长度+14(方钢尺寸),54等份(A距离)即可。
要这样的
原帖由 manbuzhe 于 2010-6-28 08:26 发表 http://www.askcad.com/bbs/images/common/back.gif距离长度+14(方钢尺寸),54等份(A距离)即可。
头尾是A距离,:) 如果只满足a=2b的话,这题多解。
(defun c:lg (/ basepoint len high width amax n a nmax oldosmode)
;;设置栏杆高度和方钢宽度默认值
(if (not lg_high)
(setq lg_high 500
lg_width 14
)
)
;;指定图形插入点
;;不接受空回车
(initget 1)
(setq basepoint (getpoint "\n指定插入点:"))
;;指定栏杆长度和栏杆高度和(或)方钢宽度
;;当用户指定的栏杆长度小于方钢宽度时图形无解,需要重新指定
;;用关键字指定栏杆高度和(或)方钢宽度后
;;需要重复运行指定栏杆长度的代码段
(while (not len)
;;检查是否存在上次指定的栏杆长度,如存在则做为本次的默认值
(if lg_length
;;存在默认值
(progn
;;指定栏杆长度接受空回车,不接受0和负数;可输入关键字"H"和"W"
(initget 6 "h w")
(setq len (getdist basepoint
(strcat "\n指定长度[高度(H)/方钢宽度(W)]<"
(rtos lg_length 2)
">:"
)
)
)
;;空回车时栏杆长度使用默认值
(if (not len)
(setq len lg_length)
)
)
;;不存在默认值
(progn
;;指定栏杆长度不接受空回车,0和负数;可输入关键字"H"和"W"
(initget 7 "h w")
(setq
len (getdist basepoint "\n指定长度[高度(H)/方钢宽度(W)]:")
)
)
)
;;检查用户输入的是长度值还是关键字
(if (numberp len)
;;输入的是长度值
(if (< len lg_width)
;;当长度值小于方钢宽度时清空输入值重新指定
(progn
(prompt (strcat "\n指定的长度不能小于" (rtos lg_width 2)))
(setq len nil)
)
)
;;输入的是关键字
(progn
;;用已存在的高度值和方钢宽度值做为下一步输入的默认值
;;用户输入时接受空回车,不接受0和负数
(initget 6)
;;检查用户输入的关键字是"H"还是"W"
(if (= len "h")
;;用户输入的关键字是"H",指定高度
(progn
(setq high
(getdist basepoint
(strcat "\n指定高度<" (rtos lg_high 2) ">:")
)
)
;;用户输入新的高度时修改默认值
(if high
(setq lg_high high)
)
)
;;用户输入的关键字是"W",指定方钢宽度
(progn
(setq width
(getdist
basepoint
(strcat "\n指定方钢宽度<" (rtos lg_width 2) ">:")
)
)
;;用户输入新的方钢宽度时修改默认值
(if width
(setq lg_width width)
)
)
)
;;清空变量,返回循环体的开始处重新由用户指定栏杆长度
(setq len nil)
)
)
)
;;把用户指定的栏杆长度赋值给全局变量,以便用做下次输入的默认值
;;计算用户可以指定的花形数量的上限
;;用于下一步检查用户指定的花形数量是否合理
(setq lg_length len
nmax (1+ (fix (/ (- len lg_width) (* lg_width 3))))
)
;;指定花形数量或A段最大长度
;;如用户指定的是花形数量,则按用户指定的花形数量画图
;;如用户指定的是A段最大长度
;;则在A段长度不超过用户指定值的前提下按最少的花形数量画图
;;用户指定的花形数量不允许超过前面计算的上限nmax,否则无解
;;用户指定的A段最大长度不允许小于方钢宽度的1.5倍,否则可能导致无解
(while (not n)
;;检查是否存在上次指定的花形数量,如存在则做为本次的默认值
(if lg_n
;;存在默认值
(progn
;;指定花形数量接受空回车,不接受0和负数;可输入关键字"L"
(initget 6 "l")
(setq n (getint (strcat "\n指定花形数量<"
(rtos lg_n 2)
">:"
)
)
)
;;空回车时花形数量使用默认值
(if (not n)
(setq n lg_n)
)
)
;;不存在默认值
(progn
;;指定花形数量不接受空回车,0和负数;可输入关键字"L"
(initget 7 "l")
(setq n (getint "\n指定花形数量:"))
)
)
;;检查用户输入的是花形数量值还是关键字
(if (numberp n)
;;输入的是花形数量值
(if (> n nmax)
;;当花形数量值大于上限时清空输入值重新指定
(progn
(prompt (strcat "\n指定的花形数量不能大于" (rtos nmax 2)))
(setq n nil)
)
;;当用户指定的花形数量合理时存入全局变量
;;以便用做下次输入的默认值
(setq lg_n n)
)
;;用户输入的是关键字
;;指定A段最大长度
(progn
;;用户指定的A段最大长度不允许小于方钢宽度的1.5倍
;;否则可能导致无解
(while (not amax)
;;检查是否存在上次指定的A段最大长度,如存在则做为本次的默认值
(if lg_amax
;;存在默认值
(progn
;;用户输入时接受空回车,不接受0和负数
(initget 6)
(setq amax (getdist basepoint
(strcat "\n指定A段最大长度<"
(rtos lg_amax 2)
">:"
)
)
)
;;空回车时A段最大长度使用默认值
(if (not amax)
(setq amax lg_amax)
)
)
;;不存在默认值
(progn
;;用户输入时不接受空回车,0和负数
(initget 7)
(setq
amax (getdist basepoint (strcat "\n指定A段最大长度:"))
)
)
)
;;当A段最大长度小于方钢宽度的1.5倍时清空输入值重新指定
(if (< amax (* lg_width 1.5))
(progn
(prompt (strcat "\n指定的A段最大长度不能小于"
(rtos (* lg_width 1.5) 2)
)
)
(setq amax nil)
)
)
)
;;把用户指定的A段最大长度存入全局变量,以便用做下次输入的默认值
;;计算最少的花形数量,当算得的结果为0或负数时,取花形数量为1
(setq
lg_amax amax
n (1+ (/ (- len (* amax 2) lg_width)
(+ (* amax 2.5) (* lg_width 3))
)
)
)
(if (> n (fix n))
(setq n (1+ (fix n)))
)
(if (< n 1)
(setq n 1)
)
)
)
)
;;画图
;;记住原来的对象捕捉设置
;;按花形数量计算A值
(setq
oldosmode (getvar "osmode")
a (/ (- len (* lg_width (+ (* (1- n) 3) 1)))
(+ (* (1- n) 2.5) 2)
)
)
;;暂时关闭对象捕捉
(setvar "osmode" 0)
;;屏蔽命令回显
(setvar "CMDECHO" 0)
;;以指定的插入点为左下角,按指定的栏杆长度和高度确定对角,画矩形
(command "rectang"
basepoint
(list (+ (car basepoint) len) (+ (cadr basepoint) lg_high))
)
;;在第一个矩形外侧一个方钢宽度处画第二个矩形
(command "rectang"
(list (- (car basepoint) lg_width)
(- (cadr basepoint) lg_width)
)
(list (+ (car basepoint) len lg_width)
(+ (cadr basepoint) lg_high lg_width)
)
)
;;将指定点移到其右侧A距离处
(setq basepoint (list (+ (car basepoint) a) (cadr basepoint)))
;;以此点为左下角,按方钢宽度和栏杆高度确定对角,画矩形,即第一条栏杆
(command "rectang"
basepoint
(list (+ (car basepoint) lg_width)
(+ (cadr basepoint) lg_high)
)
)
;;用循环语句,依次移动指定点并画出其余矩形(栏杆)
(repeat (1- n)
(setq
basepoint (list (+ (car basepoint) a lg_width) (cadr basepoint))
)
(command "rectang"
basepoint
(list (+ (car basepoint) lg_width)
(+ (cadr basepoint) lg_high)
)
)
(setq basepoint (list (+ (car basepoint) (* a 0.5) lg_width)
(cadr basepoint)
)
)
(command "rectang"
basepoint
(list (+ (car basepoint) lg_width)
(+ (cadr basepoint) lg_high)
)
)
(setq
basepoint (list (+ (car basepoint) a lg_width) (cadr basepoint))
)
(command "rectang"
basepoint
(list (+ (car basepoint) lg_width)
(+ (cadr basepoint) lg_high)
)
)
)
;;恢复对象捕捉设置
(setvar "osmode" oldosmode)
;;打开命令回显
(setvar "CMDECHO" 1)
(princ)
)
楼上的太深渊了。 太深渊了?晕倒:L
页:
[1]