乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 109|回复: 6

在ucs中如何获取块引用的几何范围

[复制链接]

4

主题

19

帖子

1

银币

初来乍到

Rank: 1

铜币
35
发表于 2020-2-26 11:01:16 | 显示全部楼层 |阅读模式

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2020-2-26 13:15:29 | 显示全部楼层
嗨,
几何扩展总是关于WCS的
如果需要当前UCS的范围,则必须将块参照从UCS转换为WCS,获取范围并将块参照及其范围转换回UCS
[CommandMethod(“ucsbox”)]
公共静态void GetExtentsAboutUcs()
{
var doc=Application.DocumentManager.MdiActiveDocument
var db=doc.Database
var-ed=doc.Editor
var-peo=new-prompentityoptions(“\n选择块引用:”)
peo。SetRejectMessage(“\n所选对象不是块引用”)
peo。AddAllowedClass(typeof(BlockReference),true)
var per=ed.GetEntity(peo)
如果(per.Status!=PromptStatus.OK)
返回
var ucs=ed.CurrentUserCoordinateSystem
使用(var tr=db.TransactionManager.StartTransaction())
{
var br=(BlockReference)tr.GetObject(per.ObjectId,OpenMode.ForWrite)
br.TransformBy(ucs.Inverse())
var exts=br.geometrycextents
使用(var pline=new Polyline())
{
pline。AddVertexAt(0,新点2d(exts.MinPoint.X,exts.MinPoint.Y),0.0,0.0和0.0)
pline。AddVertexAt(1,新点2d(exts.MaxPoint.X,exts.MinPoint.Y),0.0,0.0和0.0)
pline。AddVertexAt(2,新点2d(exts.MaxPoint.X,exts.MaxPoint.Y),0.0,0.0和0.0)
pline。AddVertexAt(3,新点2d(exts.MinPoint.X,exts.MaxPoint.Y),0.0,0.0和0.0)
pline。闭合=真
pline.SetDatabaseDefaults()
var btr=(BlockTableRecord)tr.GetObject(db.CurrentSpaceId,OpenMode.ForWrite)
btr.AppendEntity(pline)
tr.addNewlyCreatedBobObject(pline,true)
pline.TransformBy(ucs)
}
br.TransformBy(ucs)
tr.Commit()
}
}
回复

使用道具 举报

4

主题

19

帖子

1

银币

初来乍到

Rank: 1

铜币
35
发表于 2020-2-26 22:03:50 | 显示全部楼层
谢谢,如果我想在BlockReference中获得“折线”或“线”,我如何变换坐标系
[LispFunction(“Blkbox”)]
公共静态结果缓冲Blkbox(结果缓冲rb)
{
文档curDoc=Application.DocumentManager.MdiActiveDocument
数据库db=HostApplicationServices.WorkingDatabase
编辑器ed=Application.DocumentManager.MdiActiveDocument.Editor
如果(rb==null)返回null
TypedValue[]tvValues=rb.AsArray()
使用(Transaction trans=db.TransactionManager.StartTransaction())
{
ResultBuffer结果=新结果Buffer()
BlockTable bt=(BlockTable)trans.GetObject(db.BlockTableId,OpenMode.ForRead)
实体ent=(实体)trans.GetObject((ObjectId)tvValues[0]。值OpenMode.ForRead)
如果(ent!=null&&ent.GetType()==typeof(BlockReference))
{
BlockReference br=(blockreforence)trans.GetObject((ObjectId)tvValues[0]。值OpenMode.ForRead)
字符串blkname=br.Name
ed。写消息(“\n块名称:(“+blkname+”)
ObjectId blockRecordId=bt[blkname]
BlockTableRecord:blockRecord=(blocktablerrecord)blockRecordId.GetObject(OpenMode.ForRead)
Extents3d:tmpExtents3D=新的Extents3d()
int-num=0
foreach(blockRecord中的ObjectId entID)
{
实体实体=(实体)trans。GetObject(entID,OpenMode.ForRead)
//字符串str=entity.GetType().Name
//获取“折线”或“线”
if(entity.GetType()。Name==“Polyline”
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2020-2-27 02:17:32 | 显示全部楼层
entity.GetType()。名称=“行”)
{
Extents3d:tmp=entity.geometrycextents
tmpExtents3D.加法器(tmp)
num=num+1
}
}
如果(num>0)
{
Point3d-maxpt=tmpExtents3D.MaxPoint
Point3d minpt=tmpExtents3D.MinPoint
//将OCS转换为WCS
矩阵3d mt=br.BlockTransform
Point3d ptmax=maxpt.TransformBy(mt)
Point3d-ptmin=minpt.TransformBy(mt)
结果。将(new-TypedValue((int)添加到LispDataType。点3d、ptmax))
结果。将(new-TypedValue((int)添加到LispDataType。点3d、ptmin))
}
其他
{
返回null
}
}
trans.Commit()
返回结果
}
}
回复

使用道具 举报

4

主题

19

帖子

1

银币

初来乍到

Rank: 1

铜币
35
发表于 2020-2-27 03:04:23 | 显示全部楼层
我不确定是否理解您尝试实现的目标,但这里有一个获取块参照中包含的直线和多段线的UCS范围的UCS坐标的示例。   [lisp function(" blk box ")]。
公共静态result buffer blk box(result buffer Rb)。
{。
//验证LISP参数。
if (rb == null)返回null;。
TypedValue[] tvValues = rb,as array();。
if (1 。
if (tvValues[0]),TypeCode!= (int)LispDataType,ObjectId)返回null。
ObjectId id =(ObjectId)TV values[0],价值;。
如果(id,ObjectClass.DxfName!= "INSERT ")返回null。

文档curDoc =应用程序,document manager . MdiActiveDocument;。
数据库db = HostApplicationServices,工作数据库;。
编辑器ed =应用程序,document manager . mdiactivedocument . editor;。
Matrix3d ucs2wcs = ed,CurrentUserCoordinateSystem。
Matrix3d wcs2ucs = ucs2wcs,inverse();。

使用(Transaction trans = db,transaction manager . start transaction())。
{。
result buffer result = new result buffer();。
block reference br =(block reference)transGetObject(id,OpenMode。for read);。
string blkname = br,姓名;。
ed,write message(" \ n块名:("+ blkname +"),);。

使用(DBObjectCollection entity set = new DBObjectCollection())。
{。
brexplode(entity set);。
extents 3d tmpextents 3d = new extents 3d();。
int num = 0;。
foreach(Entity set中的实体实体)。
{。
//获取“折线”或“直线”。
if(实体是折线
回复

使用道具 举报

4

主题

19

帖子

1

银币

初来乍到

Rank: 1

铜币
35
发表于 2020-2-27 03:28:04 | 显示全部楼层
实体是直线)。
{。
实体,transform by(wcs 2 UCS);。
tmpExtents3D,AddExtents(实体,几何范围);。
num++;。
}。
实体,dispose();。
}。
if (0 。
{。
结果,add(new typed value((int)lisp data type,Point3d,tmpExtents3D。min point));。
结果,add(new typed value((int)lisp data type,Point3d,tmpExtents3D。MaxPoint));。
}。
}。
运输,commit();。
返回结果;。
}。
}测试结果:
  1. (setq bbox (blkbox (car (entsel))))
  2. (command "_.rectang" "_non" (car bbox) "_non" (cadr bbox))
但这一切都可以直接用LISP完成,这里有个例子:
  1. ;; gc:TMatrixFromTo
  2. ;; Returns the (4x4) transformation matrix from a coordinate system to another one
  3. ;; (same arguments type as 'trans')
  4. ;;
  5. ;; Arguments
  6. ;; from : source coordinate system (integer, vector or ename)
  7. ;; to : destination coordinate system (integer, vector or ename)
  8. (defun gc:TMatrixFromTo (from to)
  9.   (append
  10.     (mapcar
  11.       (function
  12.         (lambda (v o)
  13.           (append (trans v from to T) (list o))
  14.         )
  15.       )
  16.       '((1. 0. 0.) (0. 1. 0.) (0. 0. 1.))
  17.       (trans '(0. 0. 0.) to from)
  18.     )
  19.     '((0. 0. 0. 1.))
  20.   )
  21. )
  22. ;; gc:UcsBoundingBox
  23. ;; Returns the UCS coordinates of the entity extents (bounding box)
  24. ;; about the current UCS
  25. ;;
  26. ;; Arguments
  27. ;; obj: an entity (ENAME or VLA-OBJCET)
  28. ;; _OutputMinPtSym: a quoted symbol (output)
  29. ;; _OutputMaxPtSym: a quoted symbol (output)
  30. (defun gc:UcsBoundingBox (obj _OutputMinPtSym _OutputMaxPtSym)
  31.   (vl-load-com)
  32.   (and (= (type obj) 'ENAME)
  33.        (setq obj (vlax-ename->vla-object obj))
  34.   )
  35.   (vla-TransformBy obj (vlax-tmatrix (gc:TMatrixFromTo 1 0)))
  36.   (vla-GetBoundingBox obj _OutputMinPtSym _OutputMaxPtSym)
  37.   (vla-TransformBy obj (vlax-tmatrix (gc:TMatrixFromTo 0 1)))
  38.   (set _OutputMinPtSym (vlax-safearray->list (eval _OutputMinPtSym)))
  39.   (set _OutputMaxPtSym  (vlax-safearray->list (eval _OutputMaxPtSym)))
  40. )
使用:
  1. (gc:UcsBoundingBox (car (entsel)) 'minPt 'maxPt)
  2. (command "_.rectang" "_non" minPt "_non" maxPt)

回复

使用道具 举报

4

主题

19

帖子

1

银币

初来乍到

Rank: 1

铜币
35
发表于 2020-2-27 03:34:04 | 显示全部楼层
谢谢大家!
您的代码非常好,解决了这个问题
对于某些块引用,它无法获得“GetBoundingBox ”,因此只能进入块引用内部来获得它。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2024-11-22 05:29 , Processed in 0.316618 second(s), 66 queries .

© 2020-2024 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表