明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1658|回复: 8

[基础] 關於直線群碼的問題

[复制链接]
发表于 2010-9-8 21:04:00 | 显示全部楼层 |阅读模式

我想問一下

 

(setq xx(entsel))

(setq xxdata(entget(car xx)))

(setq xxlong(cdr(assoc 群碼 xx)))

 

我在網路上搜尋了,都找不到關於直線長度的群碼

請問它的群碼是什麼啊???

发表于 2010-9-8 21:09:00 | 显示全部楼层
直线长度根据两点可以计算出来。
 楼主| 发表于 2010-9-8 21:20:00 | 显示全部楼层
本帖最后由 作者 于 2010-9-8 22:02:52 编辑

嗯嗯,這個我知道,可是這樣的話,還要打出幾行的程式來計算

cad中,沒有辦法直接得到,然後設給某一個變數嗎?

 

換成要求圓周長 或是圓弧長度的時候。另外用哪些方法啊??

发表于 2010-9-8 22:10:00 | 显示全部楼层

回楼上

根本上来说

CAD上凡是和点线面有关的问题

都属于立体几何或者平面几何的范畴

 

 楼主| 发表于 2010-9-8 22:17:00 | 显示全部楼层
本帖最后由 作者 于 2010-9-9 7:15:17 编辑

恩,謝謝你的回覆

這是我剛剛弄出來選直線求出長度的,我想把它當成副程式,但是好冗長

幫我看看,哪邊可以簡化,或是精簡的

 

-------------------------------------

(defun C:length0()
  (setq xline(entsel"選取一直線"))
  (setq xlinedata(entget(car xline)))
  (setq xlinelist10(cdr(assoc 10 xlinedata)))
  (setq xlinelist11(cdr(assoc 11 xlinedata)))
  (setq 10xp(car xlinelist10))
  (setq 10yp(cadr xlinelist10))
  (setq 11xp(car xlinelist11))
  (setq 11yp(cadr xlinelist11))
  (setq a(- 10xp 11xp))
  (setq b(- 10yp 11yp))
  (abs a)
  (abs b)
  (setq c(expt (+ (* a a) (* b b)) 0.5))
  (list c)
   (princ "\n 線段長度= ")(princ c)
 
  (prin1)
)

-------------------------------------

 

 圖形的長度,不是從性質那邊就可以看到了

真的沒有其它方法可以直接得到嗎?

 

 楼主| 发表于 2010-9-9 21:18:00 | 显示全部楼层

还请各位指点一下>"<

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

(defun c:getdistline( / xline )
 (setq xline (car (entsel "选取直线:")))
 (princ "\n 线段长度 = ")
 (princ (distline xline))
(princ)
)

;计算直线的长度
(defun distline( line / p10 p11 )
 (setq p10 (cdr (assoc 10 (entget line))))
 (setq p11 (cdr (assoc 11 (entget line))))    ;取直线两端点坐标
 (distance p10 p11)
)

1.
你的程序里(ABS ..)是没有必要的
因为后面用到的是平方计算
而且(ABS ..)并没有赋值给任何的参数
那么这一句没有任何意义
同样(list c)也是如此
2.
计算过程中的某个中间值
如果很少用到
就不需要用一个参数来定义它
这样有两个好处
一减少内存的占用
二便于阅读
3.
如果要写成函数库
就不要加上 c:
同时将参数写成内部参数
也就是加入到括号里去
4.
子程序的调用
最好是设立形式参数
形参在调用子程序的程序中给出
而不是在子程序里人工干预
假设你需要写一个统计多个直线总长的程序
如果(distline)写成如下形式
(defun distline( line p10 p11 )
 (setq line (car (entsel "选取直线:")))
 (setq p10 (cdr (assoc 10 (entget line))))
 (setq p11 (cdr (assoc 11 (entget line))))    ;取直线两端点坐标
 (distance p10 p11)
)
那么你的主程序执行起来将会很麻烦
5.
作为一个子程序
除了某些特别情况
一般来说都应该有一个返回值
所以程序末尾应该去掉(prin1)
6.
程序简单还不要紧
复杂一点就需要在程序中做好注释
这样日后阅读或修改都方便
7.
程序应该具有一定的容错性
范例程序中没有涉及这一方面
留给你思考一下
看看该怎么做

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

图形的某些属性

比如一个圆

用list可以查看到它的周长

那是CAD系统本身做了计算并显示给你的

在它的DXF组码中是不存在这一项的

在上贴的范例程序中

用distance求两点距离

实际上CAD就是用类似你的计算方法来计算的

只不过你看不到这个过程

 楼主| 发表于 2010-9-9 22:41:00 | 显示全部楼层

謝謝你這麼精闢的解說!!

雖然有一些部份還是沒有理解的很透徹

但是我把它存下來慢慢參透

 

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

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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