明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5698|回复: 20

急!!!请教:如何画可带圆弧的双线?(已解决,感谢LONGFIN先生!)

  [复制链接]
发表于 2010-12-11 11:11:11 | 显示全部楼层 |阅读模式
本帖最后由 mandala 于 2010-12-13 00:35 编辑

请教:如何画可带圆弧的双线??

我的情况是测绘制图,画围墙时需要用双线,两条线的线型不同。要求是一路画过去,可以自由选择下一步是用直线还是圆弧。最后头尾要封闭,然后最好将第一条线打散。基本情况如下,你们能看见图吗:

12楼我写了个初步的lsp,但觉得不满意,因为无法封闭头尾,也不能打散第一条线。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2010-12-12 23:06:50 | 显示全部楼层
本帖最后由 LONGFIN 于 2010-12-12 23:14 编辑

;;试试是否可用
(defun c:TT (/ TH P E1 OP E2)
  (or (setq TH (getdist "输入墙厚度 <0.5>: "))
      (setq TH 0.5)
  )
  (if (setq P (getpoint "\n指定起点: "))
    (progn
      (setvar 'CMDECHO 1)
      (command "_.PLINE" P)
      (while (= (getvar 'CMDACTIVE) 1) (command "\\"))
      (setq E1 (entlast))
      (if (setq OP (getpoint "\n偏移方向:" ))
        (command "_.OFFSET" TH (list E1 (vlax-curve-getClosestPointTo E1 OP)) OP "")
      )
      (setq E2 (entlast))
      (if (eq E2 (entnext E1));;判断是否只生成一个对象
        (progn
          (command "_.LINE" "_NON" (vlax-curve-getStartPoint E1) "_NON"  (vlax-curve-getStartPoint E2) "")
          (command "_.LINE"  "_NON" (vlax-curve-getEndPoint E1)  "_NON" (vlax-curve-getEndPoint E2) "")
          (command "_.EXPLODE"  E1)
        )
        (progn
          (princ "绘制失败。无法偏移对象或产生的对象超过一个。")
          (setq E2 E1)
          ;;至于你要得到程序结束后所产生的对象,则参考如下的 entnext 用法
          (while (setq E1 (entnext E1))
            (entdel E1)
          )
          (entdel E2)
        )
      )
    )
  )
  (princ)
)
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2010-12-11 15:30:49 | 显示全部楼层
本帖最后由 mandala 于 2010-12-12 09:57 编辑

我还想到可以直接用画平行线,然后修改线型的方法来做:
(DEFUN C:test()

;指定层和线型:
(command "layer" "m" "wall" "")(command "linetype" "s" "wq2012" "")

;输入宽度:
(setq th (getreal "输入墙厚度:(默认为0.5):"))

;先画一条边线
(command "pline" )

;判断是否还处于pline中:
(while (= (logand (getvar "CmdActive") 1) 1) (command pause))

;作平行线:
(setq a (vlax-ename->vla-object (entlast)))
(vla-offset a (- th))

;更改第二条线的线型:
(setq b (entlast))
(command "chprop" b "" "lt" "continuous" "")

)

现在问题是,平行线是画出来了,线型也改好了,也可以直接画圆弧和直线了,但有两个问题:1、如何设定默认的th值为0.5?因为程序运行后,如果不输入th值就运行失败(感谢yshf,这个问题已经解决)。第二,我如何封闭这两条平行线的头和尾呢?用Mline的话,可以直接设置头尾封闭,但无法画圆弧,唉,各位老大帮忙想想办法?
 楼主| 发表于 2010-12-11 15:35:03 | 显示全部楼层
说起来难为情,干了10多年测绘工作,用了近10年cad,一直用别人给我写好的lsp,从来没研究过lisp。这个礼拜我刚开始学一些lisp的知识,打算自己写一些小东西急用,可惜底子太差,请各位前辈帮帮忙,谢谢了。
发表于 2010-12-11 17:35:42 | 显示全部楼层
(if (= (setq th (getreal "输入墙厚度:(默认为0.5):")) nil)
    (setq fh 0.5)
)
 楼主| 发表于 2010-12-11 18:14:44 | 显示全部楼层
本帖最后由 mandala 于 2010-12-11 18:15 编辑

谢谢楼上。有关第一个问题,我后来想出来的办法跟你差不多,我是这么写的:
(if (= nil th) (vla-offset a -0.5) (vla-offset a (- th)))

但第二个问题,就是如何把平行线的首尾两端封闭起来,我还想不出来。如果设置一个循环,如第一点输入为P1,第二点为P2……,再利用polar什么的,倒是可以做到封闭,但问题是这么画Pline,过程中无法画圆弧,不知道为什么。
 楼主| 发表于 2010-12-11 18:19:08 | 显示全部楼层
本帖最后由 mandala 于 2010-12-11 18:20 编辑

比如,如果这么画Pline的话,就无法在画的过程中画圆弧,而直接用(command "pline" ),就可以画圆弧。

大家看一下是为什么啊?


(DEFUN C:wq ()
(setq p1 (getpoint "起点:") )
(command "pline" p1  )
(while p1           
(setq p2 (getpoint p1 "下一点:"))
(if (/= p2 nil)
      (progn
    (command p2)
    (setq p1 p2)
      )
      (progn
    (command "")
    (setq p1 nil)
      ))
  )   

)
发表于 2010-12-11 18:56:15 | 显示全部楼层
本帖最后由 Student 于 2010-12-11 18:57 编辑

请用下面的代码试试和在Acad下直接执行Pline命令,有何不同:
(defun C:wq ()
  (prompt "\n请拾取围墙的各个节点:")
  (command "_.PLine")
  (while (= 1 (logand (getvar "CMDACTIVE") 1))
      (command PAUSE)
   )
)

 楼主| 发表于 2010-12-11 19:09:10 | 显示全部楼层
本帖最后由 mandala 于 2010-12-11 19:16 编辑

先谢谢楼上。

试了一下,上边的代码没有用循环,是可以画圆弧的,但我不懂 pline 和_.pline,有什么区别啊?还看到过别人用.pline,也一样能画,不懂。
发表于 2010-12-11 21:42:52 | 显示全部楼层
程序如果只为英语写,可以只写PLINE。如果要在其它语系中使用,就要加点。
而命令的原型是要加下画线的,这样在别人取消这个命令时还能使用这个命令。
 楼主| 发表于 2010-12-11 22:01:58 | 显示全部楼层
ZZXXQQ 发表于 2010-12-11 21:42
程序如果只为英语写,可以只写PLINE。如果要在其它语系中使用,就要加点。
而命令的原型是要加下画线的,这 ...

明白了,非常感谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-10-2 16:30 , Processed in 0.200647 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表