找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1171|回复: 12

高手请赐教!

[复制链接]
发表于 2002-1-30 15:14:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
问题:
给出一个选择集,如何求出其左下角和右上角的坐标?
试了几个函数都不行,望高手赐教!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-1-30 15:31:29 | 显示全部楼层

Re: 高手请赐教!

最初由 pchamer 发布
[B]问题:
给出一个选择集,如何求出其左下角和右上角的坐标?
试了几个函数都不行,望高手赐教! [/B]


意思是求选择集里所有实体的左下和右上点吗?若是,可以使用XDRX_API的


169. xdrx_entity_box

功能:求任何实体的包围盒

调用格式:(xdrx_entity_box <实体名或选择集>...<实体名或选择集>)

返回值:包围盒表(左下点 右下点 右上点 左上点)

说明:若实体名多个或者是选择集,那么求所有实体的最大的包围盒。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-1-30 15:48:01 | 显示全部楼层
我要求选择集的左下角和右上角的坐标,而不是每个实体
我对新的技术不了解,lisp和vba有类似的函数吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-1-30 15:56:12 | 显示全部楼层
最初由 pchamer 发布
[B]我要求选择集的左下角和右上角的坐标,而不是每个实体
我对新的技术不了解,lisp和vba有类似的函数吗? [/B]


没有注意到上面的函数用法吗?支持实体,也支持选择集的,而且可以支持多个的组合,比如可以用:

(xdrx_entity_box <选择集>)
(xdrx_entity_box <选择集>..<选择集>)
(xdrx_entity_box <选择集>..<实体>)
(xdrx_entity_box <实体>...<实体>)
........

提供了最灵活的组合,另这不是新技术,用之前加载XDRX_API即可了,是个ARX扩展,极大的提高了LISP的能力。ACAD的许多功能都是加载了很多ARX实现的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-1-30 16:44:59 | 显示全部楼层
1 得到选择集 pickset
2 把该选择集作成块 blkofpickst

以上两步很好解决,不多说。

3 用Vla-GetBoundingBox 来求,这种算法最快。需要注意的是,当用vlisp时
格式为:
(vla-GetBoundingBox blkofpickset 'pt1 'pt2)
注意了:pt1和pt2带’号,初学者可能不知道。
当用VB(A)时,格式为
object.GetBoundingBox(MinPoint, MaxPoint)

以下是autodesk提供的例程:
Dim anObj as Object
'Initialize this variable to any object that support
'getBoundingBox method
Dim minExt as Variant
Dim maxExt as Variant
'Follwing code returns minimum and maximum extents
'of an entity. Note that minimum
'and maximum extents are returned as Variant
Call anObj.GetBoundingBox (minExt, maxExt)
'Following code prints the min and max extents
msgBox "Min Extent is: " & minExt(0) & "," & minExt(1) & "," & minExt(2)
msgBox "Max Extent is: " & maxExt(0) & "," & maxExt(1) & "," & maxExt(2)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 23个

财富等级: 恭喜发财

发表于 2002-1-30 21:21:35 | 显示全部楼层

我这儿有这个函数,纯VisualLISP的...

具体算法是:
获得selection set
在循环中遍历selection set中的每一entity , entity->object
(vla-GetBoundingBox object'MinPoint 'MaxPoint)
比较每次得到的 MinPoint,MaxPoint ,保存比较后的值到变量中
最后返回list:  (最小的MinPoint 最大的MaxPoint)
     
  
:9 :9 :9
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-1-30 21:29:46 | 显示全部楼层

Re: 我这儿有这个函数,纯VisualLISP的...

最初由 e2002 发布
[B]具体算法是:
获得selection set
在循环中遍历selection set中的每一entity , entity->object
(vla-GetBoundingBox object'MinPoint 'MaxPoint)
比较每次得到的 MinPoint,MaxPoint ,保存比较后的值到变量中
最后... [/B]


只判断点不行,应该分X座标,Y座标单独判断。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-1-31 10:17:32 | 显示全部楼层
如何将选择集形成块,选择集不是用户在屏幕上点选形成的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-1-31 11:22:48 | 显示全部楼层
;;作成块
(command"block" "sss" (list 0 0) blkofpickst "" "insert" "sss" (list 0 0) 1 ""  "")
;;取得块
(setq blockname (entlast))
;;完事之后破解块
(command"explode" blockname "")
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-1-31 13:15:07 | 显示全部楼层
请教 laoliu   
以下是我的acad.lsp文件
(defun c:mytest()
;;作成块
(command"block" "sss" (list 0 0) blkofpickst "" "insert" "sss" (list 0 0) 1 "" "")
;;取得块
(setq blockname (entlast))
;;完事之后破解块
(command"explode" blockname "")
)
在屏幕上画一些图
运行mytest

命令: mytest
block
输入块名或 [?]: sss 指定插入基点:
选择对象:
命令: MYTEST 未知命令“MYTEST”。按 F1 查看帮助。
命令: insert 输入块名或 [?]: sss
"sss.dwg": 在搜索路径中未找到文件:
  C:\Program Files\AutoCAD 2002\(当前目录)
  C:\Program Files\AutoCAD 2002\support\
  C:\Program Files\AutoCAD 2002\fonts\
  C:\Program Files\AutoCAD 2002\help\
  C:\Program Files\AutoCAD 2002\drv\
命令:
命令: 1
命令: MYTEST 未知命令“MYTEST”。按 F1 查看帮助。
命令: MYTEST 未知命令“MYTEST”。按 F1 查看帮助。
命令: explode
选择对象:
命令: MYTEST 未知命令“MYTEST”。按 F1 查看帮助。
命令: nil
命令:

结果不对,咋办?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-1-31 19:00:42 | 显示全部楼层
正常啊。如果你用command,不管在哪儿出错,
后面的值都作为重新的输入,结果都出错。

所以,有几个办法:
1.查命令;
2.在vlisp中调试,
3.或者把command后面跟的命令减少一些,逐步测试。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-1-31 19:06:15 | 显示全部楼层
出错的就是这句
(command"block" "sss" (list 0 0) blkofpickst "" "insert" "sss" (list 0 0) 1 "" "")
blkofpickst是什么意思?
为什么没有引号?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-1-31 19:26:29 | 显示全部楼层
最初由 pchamer 发布
[B]出错的就是这句
(command"block" "sss" (list 0 0) blkofpickst "" "insert" "sss" (list 0 0) 1 "" "")
blkofpickst是什么意思?
为什么没有引号? [/B]


老兄:
  我这里有一个笔误,不好意思。
  
  前面还有两句话:

1 得到选择集 pickset
2 把该选择集作成块 blkofpickst

  如果把这两句话的 pickset 换成 blkofpickst ,把第二句的 blkofpickst
  换成"sss" 就能理解了。

  注意:你要先取得一些图形来生成 blkofpickst,也就是你所说的不是用选择来完成的,。
  
  干脆来一小段程序,你测试一下;
(defun c:mytest()
;;先画一线一园,保证选择集不为空
   (command"circle" '(0 0) 5)
   (command"line"   '(0 0) '(30 60) "")
;;取得图上所有实体的选择集
   (setq blkofpickst (ssget "x"))
;; 作块,引用,注意图中没有块 "sss" ,否则,还会出错,要不然,你就用
;; (rtos (getvar "cdate")) 来做块名
   (command"block" "sss" (list 0 0) blkofpickst "" "insert" "sss" (list 0 0) 1 "" "")
;;取得块引用
   (setq blockname (entlast))
;; 得角点 pt1 pt2
   (vla-GetBoundingBox (vlax-ename->vla-object blockname) 'pt1 'pt2)
;;完事之后破解块
   (command"explode" blockname "")
;; 从pt1到pt2画一条红线,看一看结果
   (entmake
     (list
       (cons 0 "line")
       (cons 62 1)
       (cons 10 pt1)
       (cons 11 pt2)
     )
   )
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-5 03:01 , Processed in 0.467211 second(s), 53 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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