cad生成最小包围盒lisp_晓东CAD家园-论坛-VB.NET/C#-练习 Lisp定义选择集包围盒-[ 本帖最后由 csharp 于 2014-4-26 14:22 编辑 ]\n\n没有进行坐标转...

本帖最后由 brainstorm 于 2019-10-5 21:43 编辑

学着改写一下,支持用户坐标系,功能与xdrx_entity_box相同,但是在没有安装天正机器上天正对象报错,而xdrx_entity_box没问题。速度比xdrx_entity_box要快一些

命令: TT1(ssbox)

选择对象: 指定对角点: 找到 40086 个

选择对象:

"2.141"

命令:

命令: TT2(xdrx_entity_box)

选择对象: 指定对角点: 找到 40086 个

选择对象:

"6.39"

public static Matrix3d GetUcsMatrix(Database db)

{

Point3d origin;

Vector3d xAxis, yAxis, zAxis;

if (IsPaperSpace(db))

{

origin = db.Pucsorg;

xAxis = db.Pucsxdir;

yAxis = db.Pucsydir;

}

else

{

origin = db.Ucsorg;

xAxis = db.Ucsxdir;

yAxis = db.Ucsydir;

}

zAxis = xAxis.CrossProduct(yAxis);

return Matrix3d.AlignCoordinateSystem(kOrigin, kXAxis, kYAxis, kZAxis, origin, xAxis, yAxis, zAxis);

}

public static Database GetCurDwg()

{

Database db = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database;

return db;

}

[LispFunction("ssbox")]

public static ResultBuffer SelectionBox(ResultBuffer rb)

{

Document document = Application.DocumentManager.MdiActiveDocument;

Editor editor = document.Editor;

Transaction transaction = document.TransactionManager.StartTransaction();

Matrix3d m1 = GetUcsMatrix(GetCurDwg());

m1 = m1.Inverse();

object obj = Application.GetSystemVariable("worlducs");

if (rb == null) return null;

TypedValue[] tvValues = rb.AsArray();

using (transaction)

{

try

{

ResultBuffer result = new ResultBuffer();

if (tvValues.Length == 1 && tvValues[0].TypeCode == (int)LispDataType.SelectionSet | tvValues[0].TypeCode == (int)LispDataType.ObjectId)

{

if (System.Convert.ToInt16(obj) != 0)

{

switch (tvValues[0].TypeCode)

{

case 5006:

{

Entity entity = (Entity)transaction.GetObject((ObjectId)tvValues[0].Value, OpenMode.ForRead);

Extents3d tmpExtents3D = entity.GeometricExtents;

Point3d maxpt = tmpExtents3D.MaxPoint;

Point3d minpt = tmpExtents3D.MinPoint;

result.Add(new TypedValue((int)LispDataType.Point3d, minpt));

result.Add(new TypedValue((int)LispDataType.Point3d, maxpt));

break;

}

case 5007:

{

SelectionSet ssSet = tvValues[0].Value as SelectionSet;

var ids = ssSet.GetObjectIds();

Entity ent = (Entity)transaction.GetObject(ids[0], OpenMode.ForRead);

Extents3d tmpExtents3D = ent.GeometricExtents;

for (int i = 1; i < ids.Length; i++)

{

Entity entity = (Entity)transaction.GetObject(ids, OpenMode.ForRead);

Extents3d tmp = entity.GeometricExtents;

tmpExtents3D.AddExtents(tmp);

}

Point3d maxpt = tmpExtents3D.MaxPoint;

Point3d minpt = tmpExtents3D.MinPoint;

result.Add(new TypedValue((int)LispDataType.Point3d, minpt));

result.Add(new TypedValue((int)LispDataType.Point3d, maxpt));

break;

}

}

}

else

{

switch (tvValues[0].TypeCode)

{

case 5006:

{

Entity entity = (Entity)transaction.GetObject((ObjectId)tvValues[0].Value, OpenMode.ForWrite);

entity.TransformBy(m1);

Extents3d tmpExtents3D = entity.GeometricExtents;

Point3d maxpt = tmpExtents3D.MaxPoint;

Point3d minpt = tmpExtents3D.MinPoint;

result.Add(new TypedValue((int)LispDataType.Point3d, minpt));

result.Add(new TypedValue((int)LispDataType.Point3d, maxpt));

break;

}

case 5007:

{

SelectionSet ssSet = tvValues[0].Value as SelectionSet;

var ids = ssSet.GetObjectIds();

Entity ent = (Entity)transaction.GetObject(ids[0], OpenMode.ForWrite);

ent.TransformBy(m1);

Extents3d tmpExtents3D = ent.GeometricExtents;

for (int i = 1; i < ids.Length; i++)

{

Entity entity = (Entity)transaction.GetObject(ids, OpenMode.ForWrite);

entity.TransformBy(m1);

Extents3d tmp = entity.GeometricExtents;

tmpExtents3D.AddExtents(tmp);

}

Point3d maxpt = tmpExtents3D.MaxPoint;

Point3d minpt = tmpExtents3D.MinPoint;

result.Add(new TypedValue((int)LispDataType.Point3d, minpt));

result.Add(new TypedValue((int)LispDataType.Point3d, maxpt));

break;

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值