本帖最后由 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;
}
}
}