using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
[assembly: CommandClass(typeof(Rivilis.Commands))]
namespace Rivilis
{
public class Commands
{
[CommandMethod("MapTrimmer")]
public void MyCommand()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
if (doc == null) return;
Editor ed = doc.Editor;
PromptSelectionOptions prSel = new PromptSelectionOptions();
prSel.MessageForAdding = "Выберите обрезаемые объекты";
PromptSelectionResult rsSel = ed.GetSelection(prSel);
if (rsSel.Status != PromptStatus.OK || rsSel.Value.Count == 0)
return;
PromptEntityResult rsEnt = ed.GetEntity("Выберите контур обрезки");
if (rsEnt.Status != PromptStatus.OK)
return;
SelectionSet ss = Map_DwgTrimobj(rsSel.Value, rsEnt.ObjectId, 1, 1, 1, 0);
if (ss != null)
{
ed.WriteMessage("\nВ наборе {0} объектов.", ss.Count);
ss.Dispose();
}
else
{
ed.WriteMessage("\nОшибка обрезки!!!");
}
}
static public SelectionSet Map_DwgTrimobj(
SelectionSet ss,
ObjectId boundary,
int inorout, // 1 - оставлять внутреннюю часть, 0 - оставлять наружную
int skiptopo, // 1 - пропускать объекты с ссылками на топологию, 0 - обрезать
int keepod, // 1 - сохранять объектные данные обрезаемых объектов, 0 - удалять объектные данные
int bitflag // 0 - удалять все объекты, которые не имеют ребер, находящиеся внутри или на границе
// 1 - игнорировать все объекты не имеющие ребер, находящиеся внутри или на границе
// 2 - в зависимости от того есть ли точка вставки у объектов не имеющих ребер
)
{
SelectionSet ssout = null;
// Готовим данные для Application.Invoke
ResultBuffer resbuf = new ResultBuffer();
resbuf.Add(new TypedValue((int)LispDataType.Text, "map_dwgtrimobj"));
resbuf.Add(new TypedValue((int)LispDataType.SelectionSet, ss));
resbuf.Add(new TypedValue((int)LispDataType.ObjectId, boundary));
resbuf.Add(new TypedValue((int)LispDataType.Int16, inorout));
resbuf.Add(new TypedValue((int)LispDataType.Int16, skiptopo));
resbuf.Add(new TypedValue((int)LispDataType.Int16, keepod));
resbuf.Add(new TypedValue((int)LispDataType.Int16, bitflag));
ResultBuffer result = null;
try
{
result = Application.Invoke(resbuf);
}
catch { }
// Освобождаем буфер
resbuf.Dispose();
if (result != null)
{
TypedValue[] tpArr = result.AsArray();
if (tpArr[0].TypeCode == (int) LispDataType.SelectionSet)
ssout = tpArr[0].Value as SelectionSet;
result.Dispose();
}
return ssout;
}
}
}