明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1740|回复: 8

[基础] 今天完成的题目,请各位入内指导

[复制链接]
发表于 2010-9-11 20:17:00 | 显示全部楼层 |阅读模式
这是我今天完成的题目
"点选图面的三角形,自动算出面积、画出内外接圆"

虽然对各位来说很简单,但是我为了这一题花了好多的功夫
完成之后,我觉得自己的程式好像太过冗长了
不知道哪边还可以进行修改的,请各位指导一下



---------------------------------------------------
  1. (defun C:t1()
  2.   (setq lineen01(entsel "select a line"));;0物件
  3.   (setq lineen02(entsel "select a line"));;0物件
  4.   (setq lineen03(entsel "select a line"));;0物件
  5.   (setq line01(distline lineen01));;呼叫副程式
  6.   (setq line02(distline lineen02));;呼叫副程式
  7.   (setq line03(distline lineen03));;呼叫副程式
  8.   (setq AA(area3 line01 line02 line03))
  9.   (princ "\n 面積= \n")(princ AA)
  10. ;;---------------算面積------------------------------;;
  11.   
  12.   (setq a (cadr lineen01));y物件
  13.   (setq b (cadr lineen02));y物件
  14.   (setq c (cadr lineen03));y物件
  15.   (command "circle" "3p" "tan" a "tan" b "tan" c)
  16. ;;---------------畫內切圓------------------------------;;
  17.   (setq linedata (entget(car lineen01)));x物件>資料
  18.   (setq p1(cdr(assoc 10 linedata)));子串列析出座標
  19.   (setq p2(cdr(assoc 11 linedata)));子串列析出座標
  20.   (setq p3(getpoint"選取第三點"))
  21.   (command "circle" "3P" p1 p2 p3)
  22. ;;---------------畫內切圓------------------------------;;
  23.   (prin1)
  24. )
  25. ------------------------vc-----------------------
  26. ;;得長度(點選線段)
  27. (defun distline(xline)
  28.   (setq p10(cdr(assoc 10 (entget (car xline)))));;析出起點座標
  29.   (setq p11(cdr(assoc 11 (entget (car xline)))));;析出終點座標
  30.   (setq ldist(distance p10 p11));;回傳值為數值,非直線
  31. )
  32. ;;;得三角形面積(輸入三邊長度)
  33. (defun area3(a b c)
  34.   (setq s(* (+ a b c) 0.5))
  35.   (sqrt (* s (- s a) (- s b) (- s c)))
  36. )





本帖子中包含更多资源

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

x
发表于 2010-9-11 22:05:00 | 显示全部楼层

1.

distline的形参定义的方式不好

你用到的形参是(entsel)的返回值

它实际上是一个双元表

这会限制主程序的编写

简单说就是你要用到(distline)

就必须按双元表的格式提供参数

比如说用(entsel)

如果是已知图元名的情况

你不能直接传递给(distline)

必须先(list 图元名 任意点坐标)

2.

按你的要求最后要画外接圆

那就意味着三直线均为首尾相连

所以你可以直接计算出外接圆的坐标

而不是手动选取

你可以任选第二线求两端点

将其与P1,P2比较后得出P3

3.

参数名不需要如此复杂

不是特别重要的参数

就用a、b、c又如何

4.

还是上次说的

函数库里的通用子程序里的参数

一定要写成内部参数

随着你水平的提高

你的程序会越来越复杂

有时候程序明明调试通过了

换个时间运行就是会出错

最奇怪的是怎么查都查不出错误....

 

发表于 2010-9-12 08:46:00 | 显示全部楼层

未对选择的目标进行判断。如果选择的不是LINE,程序会出错。

 楼主| 发表于 2010-9-12 08:51:00 | 显示全部楼层
ZZXXQQ发表于2010-9-12 8:46:00未对选择的目标进行判断。如果选择的不是LINE,程序会出错。

什麼是為對選擇的目標進行判斷??   是用判斷式去判斷所選的圖形是不是直線嗎??

 楼主| 发表于 2010-9-12 09:06:00 | 显示全部楼层

1.你第一點的意思是說,為了要讓副程式能夠接受的函數,所以(entsel)得到的形參,還要再經過 entget、car、cdr、等繁複的手續才能讓(distline)接受。你是說這樣的過程太複雜、也讓主程式為了要配合,而限制太多嗎??

可是目前我能想到的方式只有這個耶,有什麼比較好的的方式嗎? 

 

4.第四點的意思是說,副程式後面的括號(),distline來說,要填入(/xline)<----這樣子嗎??

发表于 2010-9-12 09:13:00 | 显示全部楼层

本帖子中包含更多资源

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

x
 楼主| 发表于 2010-9-12 10:02:00 | 显示全部楼层
真厲害,高手寫的就是不一樣
发表于 2010-9-12 14:23:00 | 显示全部楼层

关于1,4点你的理解基本正确

(car (entsel))比(entsel)适合参数传递

写个统计多条直线总长的程序练习一下

你就会明白了

形参、内参不是( / xline ... )这样写

而是( xline / ... )这样写

关于这个还是看那个帖子的范例吧

 

 

 楼主| 发表于 2010-9-12 17:52:00 | 显示全部楼层

嗯嗯,我把它找相反了,哈哈

(自變量/內部變量)

 

等我學習到後面一點的章節,再來用你說的那個多條長線統計的方式

另外,我發現CAD中就有內建算面積的指令了"AREA"

好像就不用再另外用LISP寫海龍公式的程式出來,

這樣程式就可以再縮得更短了

 

謝謝你給我這麼多觀念,哈哈

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

本版积分规则

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

GMT+8, 2024-10-2 10:25 , Processed in 0.167653 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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