Тема: Выделение и подсветка примитивов в AutoCAD средствами .NET/COM

Пример для обсуждения:

//////////////////////////////////////////////////////////////////////////
//   Выделение и подсветка различными методами примитивов
//   в AutoCAD средствами .NET/COM
//////////////////////////////////////////////////////////////////////////
using System ;
using System.Collections ;
using System.Threading;
using Autodesk.AutoCAD.Runtime ;
using Autodesk.AutoCAD.Geometry ;
using Autodesk.AutoCAD.ApplicationServices ;
using Autodesk.AutoCAD.EditorInput ;
using Autodesk.AutoCAD.DatabaseServices ;
using Autodesk.AutoCAD.Interop ;
using Autodesk.AutoCAD.Interop.Common;
[assembly: CommandClass(typeof(ZoomLibrary.Zoom))]
namespace ZoomLibrary
{
  public class Zoom
  {
    /// <summary>
    /// Функция для зумирования примитива на экране AutoCAD
    /// id - ObjectId для примитива
    /// zoomFactor - процент высоты/ширины экранной области,
    /// которую будет занимать примитив после зумирования (от 0 до 100)
    /// </summary>
    static public void ZoomObject(ObjectId id, double zoomFactor)
    {
      Database db = HostApplicationServices.WorkingDatabase;
      AcadApplication app = (AcadApplication) Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication;
      Point3d center;
      double zoomHeight = 0.0;
      using (Transaction tr = db.TransactionManager.StartTransaction())
      {
        object oMinpt = new object(), oMaxpt = new object();
        double [] dMinpt = new double[3], dMaxpt = new double[3];
        Entity en = (Entity) tr.GetObject(id,OpenMode.ForRead);
        AcadEntity en_com = en.AcadObject as AcadEntity;
        object minPt = new object(), maxPt = new object();
        en_com.GetBoundingBox(out oMinpt, out oMaxpt);
        dMinpt = (double []) oMinpt; dMaxpt = (double []) oMaxpt;
        double heightEnt = dMaxpt[1] - dMinpt[1];
        double widthEnt  = dMaxpt[0] - dMinpt[0];
        object objRes = app.ActiveDocument.GetVariable("SCREENSIZE");
        Point2d screenRes = new Point2d((double []) objRes);
        double aspectScreen = screenRes.Y / screenRes.X;
        if (widthEnt*aspectScreen > heightEnt) {
          zoomHeight = widthEnt*aspectScreen*100/Math.Max(zoomFactor,1e-6);
        } else {
          zoomHeight = heightEnt*100/Math.Max(zoomFactor,1e-6);
        }
        center = new Point3d(
          (dMinpt[0]+dMaxpt[0]) * 0.5,
          (dMinpt[1]+dMaxpt[1]) * 0.5,
          (dMinpt[2]+dMaxpt[2]) * 0.5
        );
      }
      app.ZoomCenter(center.ToArray(),zoomHeight);
    }
    /// <summary>
    /// Функция для получения коллекции примитивов - клонов переданного
    /// примитива. Если примитив не блок - в коллекции только один примитив,
    /// если блок, то идет рекурсивное расчленение и в коллекции все примитивы
    /// входящие в блок и во все вложенные. Для атрибутов производится отдельная
    /// обработка.
    /// </summary>
    static public DBObjectCollection DeepCloneExplode(Entity en)
    {
      DBObjectCollection fullCol = new DBObjectCollection();
      BlockReference blkRef = en as BlockReference;
      if (blkRef != null) {
        DBObjectCollection partCol = new DBObjectCollection();
        AttributeCollection attCol = blkRef.AttributeCollection;
        Document doc = Application.DocumentManager.MdiActiveDocument;
        using (DocumentLock doclock = doc.LockDocument())  {
          using (Transaction tr = doc.TransactionManager.StartTransaction()) {
            foreach (ObjectId id in (IEnumerable) attCol) {
              AttributeReference attRef = (AttributeReference) tr.GetObject(id,OpenMode.ForRead);
              if (!attRef.Invisible) {
                DBText txt = new DBText();
                try {
                  txt.SetDatabaseDefaults(doc.Database);
                  txt.AdjustAlignment(doc.Database);
                  txt.VerticalMode   = attRef.VerticalMode;
                  txt.HorizontalMode = attRef.HorizontalMode;
                  txt.Position       = attRef.Position;
                  txt.Normal         = attRef.Normal;
                  txt.Rotation       = attRef.Rotation;
                  txt.Height         = attRef.Height;
                  txt.WidthFactor    = attRef.WidthFactor;
                  txt.Thickness      = attRef.Thickness;
                  txt.TextStyle      = attRef.TextStyle;
                  txt.TextString     = attRef.TextString;
                  txt.Oblique        = attRef.Oblique;
                  txt.Color          = attRef.Color;
                  txt.LayerId        = attRef.LayerId;
                  txt.AlignmentPoint = attRef.AlignmentPoint;
                }
                catch {
                }
                fullCol.Add(txt);
              }
            }
          }
        }
        en.Explode(partCol);
        foreach (DBObject en_col in partCol) {
          AttributeDefinition attdef = en_col as AttributeDefinition;
          if (attdef == null) {
            using (DBObjectCollection locCol = DeepCloneExplode((Entity) en_col)) {
              foreach (DBObject en_col1 in locCol) fullCol.Add(en_col1);
            }
          }
        }
        partCol.Dispose();
      } else {
        fullCol.Add((en.ObjectId != ObjectId.Null)?(DBObject)en.Clone():(DBObject)en);
      }
      return fullCol;
    }
    /// <summary>
    /// Функция производит "мигание" объектом при помощи изменения веса линии (LineWeight)
    /// Есть ряд исключений, когда это не работает. Например, для текста на основе TrueType
    /// шрифта (во всяком случае в AutoCAD 2006 SP1).
    /// </summary>
    /// <param name="id">ObjectId для примитива</param>
    /// <param name="num">Количество "миганий"</param>
    /// <param name="delay1">Длительность "подсвеченного" состояния</param>
    /// <param name="delay2">Длительность "неподсвеченного" состояния</param>
    static public void FlickObjectLineWeight(ObjectId id, int num, int delay1, int delay2)
    {
      Document doc = Application.DocumentManager.MdiActiveDocument;
      object lwdisplay = Application.GetSystemVariable("LWDISPLAY");
      if ((short)lwdisplay == 0) Application.SetSystemVariable("LWDISPLAY",(short)1);
      LineWeight prevLineWeight = LineWeight.ByLineWeightDefault;
      DBObjectCollection expEnts = null;
      ArrayList ids = new ArrayList();
      // Cloneing entities for highlighting
      using (DocumentLock doclock = doc.LockDocument())  {
        using (Transaction tr = doc.TransactionManager.StartTransaction()) {
          Entity en = (Entity) tr.GetObject(id,OpenMode.ForRead);
          expEnts = DeepCloneExplode(en);
          BlockTableRecord btr = (BlockTableRecord)tr.GetObject(en.OwnerId, OpenMode.ForWrite);
          foreach (Entity ent in expEnts) {
            ObjectId expid = btr.AppendEntity(ent);
            ids.Add(expid);
            tr.AddNewlyCreatedDBObject(ent,true);
          }
          expEnts.Dispose();
          tr.Commit();
        }
      }
      for (int i = 0; i < num; i++)
      {
        // Highlight entity
        using (DocumentLock doclock = doc.LockDocument())  {
          using (Transaction tr = doc.TransactionManager.StartTransaction()) {
            foreach (ObjectId eId in ids) {
              Entity en = (Entity) tr.GetObject(eId,OpenMode.ForWrite);
              en.LineWeight = LineWeight.LineWeight211; // Maximum lineweight
            }
            tr.Commit();
          }
        }
        doc.Editor.UpdateScreen();
        // Wait for delay1 msecs
        Thread.Sleep(delay1);
        // Unhighlight entity
        using (DocumentLock doclock = doc.LockDocument()) {
          using (Transaction tr = doc.TransactionManager.StartTransaction()) {
            foreach (ObjectId eId in ids) {
              Entity en = (Entity) tr.GetObject(eId,OpenMode.ForWrite);
              en.LineWeight = prevLineWeight;
            }
            tr.Commit();
          }
        }
        doc.Editor.UpdateScreen();
        // Wait for delay2 msecs
        Thread.Sleep(delay2);
      }
      // Erase cloned entities
      using (DocumentLock doclock = doc.LockDocument()) {
        using (Transaction tr = doc.TransactionManager.StartTransaction()) {
          foreach (ObjectId eId in ids) {
            Entity en = (Entity) tr.GetObject(eId,OpenMode.ForWrite);
            en.Erase();
          }
          tr.Commit();
        }
      }
      Application.SetSystemVariable("LWDISPLAY",lwdisplay);
    }
    /// <summary>
    /// Функция производит "мигание" объектом при помощи Highlight/Unhighlight
    /// </summary>
    /// <param name="id">ObjectId для примитива</param>
    /// <param name="num">Количество "миганий"</param>
    /// <param name="delay1">Длительность "подсвеченного" состояния</param>
    /// <param name="delay2">Длительность "неподсвеченного" состояния</param>
    static public void FlickObjectHighlight(ObjectId id, int num, int delay1, int delay2)
    {
      Document doc = Application.DocumentManager.MdiActiveDocument;
      for (int i = 0; i < num; i++)
      {
        // Highlight entity
        using (DocumentLock doclock = doc.LockDocument())
        {
          using (Transaction tr = doc.TransactionManager.StartTransaction())
          {
            Entity en = (Entity) tr.GetObject(id,OpenMode.ForWrite);
            ObjectId[] ids = new ObjectId[1] ; ids[0] = id;
            SubentityId index = new SubentityId(SubentityType.Null, 0);
            FullSubentityPath path = new FullSubentityPath(ids, index);
            en.Highlight(path,true);
            tr.Commit();
          }
        }
        doc.Editor.UpdateScreen();
        // Wait for delay1 msecs
        Thread.Sleep(delay1);
        // Unhighlight entity
        using (DocumentLock doclock = doc.LockDocument())
        {
          using (Transaction tr = doc.TransactionManager.StartTransaction())
          {
            Entity en = (Entity) tr.GetObject(id,OpenMode.ForWrite);
            ObjectId[] ids = new ObjectId[1] ; ids[0] = id;
            SubentityId index = new SubentityId(SubentityType.Null, 0);
            FullSubentityPath path = new FullSubentityPath(ids, index);
            en.Unhighlight(path,true);
            tr.Commit();
          }
        }
        doc.Editor.UpdateScreen();
        // Wait for delay2 msecs
        Thread.Sleep(delay2);
      }
    }
    /// <summary>
    /// Функция производит "мигание" объектом при помощи включения/выключения видимости
    /// выбранного примитива
    /// </summary>
    /// <param name="id">ObjectId для примитива</param>
    /// <param name="num">Количество "миганий"</param>
    /// <param name="delay1">Длительность "подсвеченного" состояния</param>
    /// <param name="delay2">Длительность "неподсвеченного" состояния</param>
    static public void FlickObjectVisible(ObjectId id, int num, int delay1, int delay2)
    {
      Document doc = Application.DocumentManager.MdiActiveDocument;
      bool prevVisibility = true;
      for (int i = 0; i < num; i++) {
        // Highlight entity
        using (DocumentLock doclock = doc.LockDocument()) {
          using (Transaction tr = doc.TransactionManager.StartTransaction())
          {
            Entity en = (Entity) tr.GetObject(id,OpenMode.ForWrite);
            prevVisibility = en.Visible;
            en.Visible = !en.Visible;
            tr.Commit();
          }
        }
        doc.Editor.UpdateScreen();
        // Wait for delay1 msecs
        Thread.Sleep(delay1);
        // Unhighlight entity
        using (DocumentLock doclock = doc.LockDocument()) {
          using (Transaction tr = doc.TransactionManager.StartTransaction()) {
            Entity en = (Entity) tr.GetObject(id,OpenMode.ForWrite);
            en.Visible = prevVisibility;
            tr.Commit();
          }
        }
        doc.Editor.UpdateScreen();
        // Wait for delay2 msecs
        Thread.Sleep(delay2);
      }
    }
    /// <summary>
    /// Только для проверки
    /// </summary>
    // Define Command "TestZoom"
    [CommandMethod("TestZoom")]
    static public void TestZoom() {
      Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
      PromptEntityResult rse = ed.GetEntity("\nSelect Entity: ");
      if (rse.Status == PromptStatus.OK) {
        double zoomFactor = 100.0;
        PromptDoubleOptions pdo = new PromptDoubleOptions("\nEnter zoom factor in percent (0...100) <100>: ");
        pdo.UseDefaultValue = true; pdo.DefaultValue = zoomFactor;
        pdo.AllowNegative = false; pdo.AllowZero = false; pdo.AllowNone = false;
        PromptDoubleResult rsd = ed.GetDouble(pdo);
        switch (rsd.Status) {
            case PromptStatus.Cancel:
            case PromptStatus.Error:
                return;
            case PromptStatus.OK:
            zoomFactor = rsd.Value;
                break;
            default:
                break;
        }
        ZoomObject(rse.ObjectId,zoomFactor);
        FlickObjectLineWeight(rse.ObjectId,3,350,200);
        FlickObjectHighlight(rse.ObjectId,3,350,200);
        FlickObjectVisible(rse.ObjectId,3,350,200);
      }
    }
  }
}

Re: Выделение и подсветка примитивов в AutoCAD средствами .NET/COM

Здравствуйте Александр Ривилис а как можно выделить вершину полилинии ?

Re: Выделение и подсветка примитивов в AutoCAD средствами .NET/COM

> x3m
Как вариант - пометить его крестиком, как это делает команда PEDIT->Edit vertex. Это можно сделать при помощи примитивов (отрезков), которые потом стирать (при отказе или подтверждении), а можно при помощи GRDRAW. В lisp'е - это функция (grdraw), в ObjectARX - это acedGrDraw(). В .NET в явном виде ее нет, но очень несложно сделать:

[System.Security.SuppressUnmanagedCodeSecurity]
[DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl)]
extern static public int acedGrDraw(double[] pt1, double [] pt2, int color, int highlight);
// Пример использования - нарисовать отрезок красного (1-го) цвета из точки
// (0,0,0) в точку (100,100,0):
// acedGrDraw(new Point3d(0,0,0).ToArray(), new Point3d(100,100,0).ToArray(), 1, 0);

Следует учитывать, что такие линии автоматичеки стираются при REDRAW/REGEN/PAN/ZOOM и т.д. Самому их можно стереть используя acedRedraw() - определение ее и метод использования здесь (не хочется переписывать весь код):  http://www.theswamp.org/index.php?topic=12431.0

Re: Выделение и подсветка примитивов в AutoCAD средствами .NET/COM

Спасибо буду пробовать.

Re: Выделение и подсветка примитивов в AutoCAD средствами .NET/COM

> x3m
Попробуй это:

//////////////////////////////////////////////////////////////////////////
//         (C) Copyright 2006 by Alexander Rivilis
//////////////////////////////////////////////////////////////////////////
using System ;
using System.Runtime.InteropServices ;
using Autodesk.AutoCAD.Runtime ;
using Autodesk.AutoCAD.ApplicationServices ;
using Autodesk.AutoCAD.DatabaseServices ;
using Autodesk.AutoCAD.EditorInput ;
using Autodesk.AutoCAD.Geometry ;
using AcAp = Autodesk.AutoCAD.ApplicationServices.Application;
[assembly: CommandClass(typeof(Rivilis.VertexSelect))]
namespace Rivilis
{
  public class VertexSelect
  {
    /// <summary>
    /// Тестовая функция для выбора вершины полилинии
    /// </summary>
    [CommandMethod("VerSel")]
    static public void VerSel()
    {
      ObjectId [] ids = {ObjectId.Null, ObjectId.Null};
      Document doc = AcAp.DocumentManager.MdiActiveDocument;
      Editor   ed = doc.Editor;
      PromptNestedEntityResult rs;
      while ((rs = ed.GetNestedEntity("\nВыберите вершину полилинии : ")).Status == PromptStatus.OK)
      {
        // Нужно только в паре с DrawMarkerWithLines
        EraseObjects(ids);
        // Нужно только в паре с DrawMarkerWithGrDraw
        // acedRedraw(null,1);
        using (Transaction tr = doc.TransactionManager.StartTransaction())
        {
          Entity en = tr.GetObject(rs.ObjectId,OpenMode.ForRead) as Entity;
          Vertex2d vert2d = en as Vertex2d;
          PolylineVertex3d vert3d = en as PolylineVertex3d;
          Polyline pline = en as Polyline;
          Point3d p_center = new Point3d();
          if (vert2d != null)
          {
            p_center = vert2d.Position;
          }
          else if (vert3d != null)
          {
            p_center = vert3d.Position;
          }
          else if (pline != null)
          {
            // Здесь чуть сложнее - находим вершину вблизи указанной точки
            Vector3d viewDir = // Направление взгляда в WCS
              Trans.Ucs2Wcs((Point3d)AcAp.GetSystemVariable("VIEWDIR"),true).GetAsVector().GetNormal();
            // Ближайшая к указанной на кривой точка.
            Point3d p_clos = pline.GetClosestPointTo(Trans.Ucs2Wcs(rs.PickedPoint,false), viewDir, true);
            double parm = System.Math.Round(pline.GetParameterAtPoint(p_clos));
            // Координата ближайшей вершины
            p_center = pline.GetPointAtParameter(parm);
          }
          else
          {
            ed.WriteMessage("\nЭто не 2d/3d-полилилия! ");
            tr.Commit();
            continue;
          }
          tr.Commit();
          // Вариант отрисовки маркеров при помощи отрезков
          DrawMarkerWithLines(
            p_center, // Центр маркера в WCS
            10,       // 10% высоты экрана
            3,        // Цвет маркера
            ref ids);
          // Вариант отрисовки маркеров с использованием GrDraw
          // DrawMarkerWithGrDraw(p_center,10,3);
        }
      }
      // Нужно только в паре с DrawMarkerWithLines
      EraseObjects(ids);
      // Нужно только в паре с DrawMarkerWithGrDraw
      // acedRedraw(null,1);
    }
    /// <summary>
    /// Функция для отрисовки маркера отрезками
    /// </summary>
    /// <param name="p">Точка (в WCS) для отрисовки цента маркера</param>
    /// <param name="prcHeight">Высота (в % от экрана) маркера</param>
    /// <param name="markColor">Цвет маркера</param>
    /// <param name="ids">Массив ObjectId куда помещаются ObjectId созданных отрезков</param>
    static private void DrawMarkerWithLines (Point3d p, double prcHeight, int markColor, ref ObjectId[] ids)
    {
      Point3d p_view = Trans.Wcs2Dcs(p,false);
      double d = GetViewportHeight()*prcHeight/100.0; // % от высоты экрана
      Vector3d v1 = new Vector3d(+1,+1,0).GetNormal();
      Vector3d v2 = new Vector3d(-1,+1,0).GetNormal();
      Point3d pt11 = Trans.Dcs2Wcs(new Point3d((p_view + 0.5*d*v1).ToArray()),false);
      Point3d pt12 = Trans.Dcs2Wcs(new Point3d((p_view - 0.5*d*v1).ToArray()),false);
      Point3d pt21 = Trans.Dcs2Wcs(new Point3d((p_view + 0.5*d*v2).ToArray()),false);
      Point3d pt22 = Trans.Dcs2Wcs(new Point3d((p_view - 0.5*d*v2).ToArray()),false);
      Line ln1 = new Line(pt11,pt12);
      Line ln2 = new Line(pt21,pt22);
      Document doc = AcAp.DocumentManager.MdiActiveDocument;
      using (Transaction tr = doc.TransactionManager.StartTransaction())
      {
        BlockTableRecord btr = tr.GetObject(doc.Database.CurrentSpaceId,OpenMode.ForWrite) as BlockTableRecord;
        if (btr != null && ln1 != null && ln2 != null)
        {
          ln1.SetDatabaseDefaults(); ln2.SetDatabaseDefaults();
          ln1.ColorIndex = markColor; ln2.ColorIndex = markColor;
          ids[0] = btr.AppendEntity(ln1); ids[1] = btr.AppendEntity(ln2);
          tr.AddNewlyCreatedDBObject(ln1,true); tr.AddNewlyCreatedDBObject(ln2,true);
        }
        tr.Commit();
      }
    }
    /// <summary>
    /// Функция для отрисовки маркера при помощи GrDraw
    /// </summary>
    /// <param name="p">Точка (в WCS) для отрисовки цента маркера</param>
    /// <param name="prcHeight">Высота (в % от экрана) маркера</param>
    /// <param name="markColor">Цвет маркера</param>
    static private void DrawMarkerWithGrDraw (Point3d p, double prcHeight, int markColor)
    {
      Point3d p_view = Trans.Wcs2Dcs(p,false);
      double d = GetViewportHeight()*prcHeight/100.0; // % от высоты экрана
      Vector3d v1 = new Vector3d(+1,+1,0).GetNormal();
      Vector3d v2 = new Vector3d(-1,+1,0).GetNormal();
      Point3d pt11 = Trans.Dcs2Ucs(new Point3d((p_view + 0.5*d*v1).ToArray()),false);
      Point3d pt12 = Trans.Dcs2Ucs(new Point3d((p_view - 0.5*d*v1).ToArray()),false);
      Point3d pt21 = Trans.Dcs2Ucs(new Point3d((p_view + 0.5*d*v2).ToArray()),false);
      Point3d pt22 = Trans.Dcs2Ucs(new Point3d((p_view - 0.5*d*v2).ToArray()),false);
      acedGrDraw(pt11.ToArray(),pt12.ToArray(),markColor,0);
      acedGrDraw(pt21.ToArray(),pt22.ToArray(),markColor,0);
    }
    static private double GetViewportHeight()
    {
      return (double) AcAp.GetSystemVariable("VIEWSIZE");
    }
    static private void EraseObjects(ObjectId [] ids)
    {
      Document doc = AcAp.DocumentManager.MdiActiveDocument;
      using (Transaction tr = doc.TransactionManager.StartTransaction())
      {
        foreach (ObjectId id in ids)
        {
          if (!id.IsNull)
          {
            Entity en = tr.GetObject(id,OpenMode.ForWrite) as Entity;
            if (en != null) en.Erase();
          }
        }
        tr.Commit();
      }
    }
    [System.Security.SuppressUnmanagedCodeSecurity]
    [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl)]
    extern static public int acedGrDraw(double[] pt1, double [] pt2, int color, int highlight);
    [System.Security.SuppressUnmanagedCodeSecurity]
    [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl)]
    private static extern int acedRedraw(long [] name, int mode);
  }
  /// <summary>
  /// Класс для преобразования точки (или вектора) между системами координат.
  /// </summary>
  class Trans
  {
    const int RTSHORT    = 5003; /* Short integer */
    //////////////////////////////////////////////////////////////////////////
    // Смотрите в ObjectARX SDK Reference Guide описание функции acedTrans
    //////////////////////////////////////////////////////////////////////////
    [System.Security.SuppressUnmanagedCodeSecurity]
    [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl)]
    extern static private int acedTrans(double[] pt1, IntPtr rb1, IntPtr rb2, int disp, double[] pt2);
    public static Point3d Ucs2Wcs(Point3d pt, bool isVect)
    {
      return Translate(pt,1,0,isVect);
    }
    public static Point3d Wcs2Ucs(Point3d pt, bool isVect)
    {
      return Translate(pt,0,1,isVect);
    }
    public static Point3d Wcs2Dcs(Point3d pt, bool isVect)
    {
      return Translate(pt,0,2,isVect);
    }
    public static Point3d Dcs2Wcs(Point3d pt, bool isVect)
    {
      return Translate(pt,2,0,isVect);
    }
    public static Point3d Ucs2Dcs(Point3d pt, bool isVect)
    {
      return Translate(pt,1,2,isVect);
    }
    public static Point3d Dcs2Ucs(Point3d pt, bool isVect)
    {
      return Translate(pt,2,1,isVect);
    }
    /// <summary>
    /// Функция преобразования между системами координат
    /// </summary>
    /// <param name="pt">Точка для преобразования</param>
    /// <param name="sys1">Первая система координат</param>
    /// <param name="sys2">Вторая система координат</param>
    /// <param name="isVect">Если false - преобразование точки, если true - преобразование вектора</param>
    /// <returns>Возвращает преобразованную точку</returns>
    private static Point3d Translate(Point3d pt, int sys1, int sys2,bool isVect)
    {
      double [] pt_tr = {0,0,0};
      ResultBuffer rb1 = new ResultBuffer(new TypedValue(RTSHORT,sys1));
      ResultBuffer rb2 = new ResultBuffer(new TypedValue(RTSHORT,sys2));
      acedTrans(pt.ToArray(),rb1.UnmanagedObject,rb2.UnmanagedObject,isVect?1:0, pt_tr);
      rb1.Dispose(); rb2.Dispose();
      return new Point3d(pt_tr);
    }
  };
}

Re: Выделение и подсветка примитивов в AutoCAD средствами .NET/COM

Здравствуйте у меня тут инэт кончился сидел на дуал апе щас вот к адсл подключаюсь. Большучее вам
спасибо буду пробовать и разбератся.

Re: Выделение и подсветка примитивов в AutoCAD средствами .NET/COM

А можно ли достич эффекта такого же как после выбора объектов мышью?

Re: Выделение и подсветка примитивов в AutoCAD средствами .NET/COM

777 пишет:

А можно ли достич эффекта такого же как после выбора объектов мышью?

Что ты имеешь в виду? Появление "ручек" или эффект аналогичный  выполнению метода Highlight для примитива?

Re: Выделение и подсветка примитивов в AutoCAD средствами .NET/COM

Появление "ручек".

Re: Выделение и подсветка примитивов в AutoCAD средствами .NET/COM

Использовать P/Invoke для функции acedSSSetFirst или Autodesk.AutoCAD.EditorInput.Editor.SetImpliedSelection()

Re: Выделение и подсветка примитивов в AutoCAD средствами .NET/COM

Не вижу SetImpliedSelection(). Новая (в какой версии)? смотрю SDK 2009.

Re: Выделение и подсветка примитивов в AutoCAD средствами .NET/COM

Смотришь в документации? Там ее нет. Смотри при помощи Object Browser.

Re: Выделение и подсветка примитивов в AutoCAD средствами .NET/COM

Спасибо, теперь вижу, только SelectImplied(). буду пробовать...

Re: Выделение и подсветка примитивов в AutoCAD средствами .NET/COM

777 пишет:

Спасибо, теперь вижу, только SelectImplied(). буду пробовать...

SelectImplied() - это не то.

Re: Выделение и подсветка примитивов в AutoCAD средствами .NET/COM

в 2009-м вижу, но надо в 2006-м...

Re: Выделение и подсветка примитивов в AutoCAD средствами .NET/COM

В 2006 через P/Invoke для acedSSSetFirst