Тема: AutoCAD 2002. MVS .NET 7. Как нарисовать замкнутую полилинию?

Хочу из приложения на C# рисовать в ACAD`е замкнутую полилинию,а затем ее экструдить(выдавливать) с помощью acad.ActiveDocument.ModelSpace.AddExtrudeSolid(...,...,...).Здесь в качестве первого параметра надо указать область AutoCAD.AcadRegion,в которую нужно добавить полилинию c помощью acad.ActiveDocument.ModelSpace.AddRegion(object ObjectList).Так вот, полилиния создается и вырисовывается, а добавляться в регион не хочет.Выдается ошибка о не совместимости типов:не может привести тип object к AutoCAD.AcadRegion.
Что необходимо еще добавить или изменить,чтобы сделать выдавливание с помощью acad.ActiveDocument.ModelSpace.AddExtrudeSolid?
И второе.Из приложения на C# команда fillet,которую я посылаю в командную строку Acad`а, ведет себя,на мой вгляд,не адекватно:скругляет совсем не то ребро.Хотя точка,которую я указываю,100% лежит на нужном мне ребре.Это я проверяла в ручную,когда строила скругление на этом же объекте непосредственно в Acad`е.Такое впечатление,что он,в момент построения скругления,меняет систему координат или путает нумерацию ребер в своей таблице примитивов.Как можно справиться с этой проблемой?Можно ли обратиться к команде fillet через экземпляр Acad`овского приложения и ModelSpace?

Re: AutoCAD 2002. MVS .NET 7. Как нарисовать замкнутую полилинию?

Вот код, который оределяет команду для создания куба. Може это подтолкнет к мысли что в Вашей программе "не так":

using System;
using System.Runtime.InteropServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;
[assembly: CommandClass(typeof(ClassLibrary.Class))]
namespace ClassLibrary {
  public class Class {
    // Define Command "CreateBox"
    [CommandMethod("CreateBox")]
    static public void CreateBox() {
      Database db = AcadApp.DocumentManager.MdiActiveDocument.Database;
      ObjectId btrId = db.CurrentSpaceId;
      Transaction trans = db.TransactionManager.StartTransaction();
      try {
        Point2d [] pts = new Point2d[4];
        pts[0] = new Point2d(0,0);
        pts[1] = new Point2d(0,100);
        pts[2] = new Point2d(100,100);
        pts[3] = new Point2d(100,0);
        Polyline pline = new Polyline();
        for (int i=0; i<pts.Length; i++)
          pline.AddVertexAt(i, pts[i], 0.0, 0.0, 0.0);
        pline.Closed = true;
        BlockTableRecord btr = (BlockTableRecord)trans.GetObject(btrId, OpenMode.ForWrite);
        DBObjectCollection segs = new DBObjectCollection();
        segs.Add(pline);
        DBObjectCollection regions = Region.CreateFromCurves(segs);
        Region reg = (Region) regions[0];
        Solid3d box = new Solid3d();
        box.Extrude(reg,100,0);
        btr.AppendEntity(box);
        trans.AddNewlyCreatedDBObject(box, true);
      }
      catch (System.Exception) {
        trans.Dispose();            
      }
      trans.Commit();
    }
  }
}

Re: AutoCAD 2002. MVS .NET 7. Как нарисовать замкнутую полилинию?

P.S. А это второй вариант, работающий как у Вас (т.е через Autodesk.AutoCAD.Interop) :

//     using AcadInter = Autodesk.AutoCAD.Interop;
//     using AcadCom   = Autodesk.AutoCAD.Interop.Common;
    static public void CreateBoxInterop()
    {
      AcadInter.AcadApplication acad =
        (AcadInter.AcadApplication)Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication;
      AcadCom.AcadModelSpace ms = acad.ActiveDocument.ModelSpace;
      try
      {
        Double [] pts =
        {
            0,  0, 0,
          100,  0, 0,
          100,100, 0,
            0,100, 0
        };
        AcadCom.AcadPolyline poly = ms.AddPolyline(pts);
        poly.Closed = true;
        AcadCom.AcadPolyline [] entlst = { poly };
        //----------------------------------------------------------------
        // Маленькая тонкость AddRegion - возвращается не AcadRegion,
        // а массив объектов, т.к. в результате может получится не один
        // регион или вообще не регион!
        //----------------------------------------------------------------
        Object[] regs = (Object[]) ms.AddRegion(entlst);
        poly.Erase(); // полилинию удаляем - она нам уже не нужна
        foreach (AcadCom.AcadRegion reg in regs)
        {
          // Выдавливаем регион и сразу его удаляем - он нам уже не нужен
          ms.AddExtrudedSolid(reg,100,0);
          reg.Erase();
        }
      }
      catch (System.Exception e)
      {
          acad.ActiveDocument.Utility.Prompt(e.ToString());
      }
    }
  }

Re: AutoCAD 2002. MVS .NET 7. Как нарисовать замкнутую полилинию?

Спасибо!Второй вариант - это то,как я и хотела.По крайней мере,по тому же принципу.
Только вот один нюанс: AcadInter и  AcadCom   не видны в моем проекте. А  через Autodesk. не виден  AutoCAD и через AutoCAD. не виден Interop. Аналогично и со строкой Autodesk.AutoCAD.Interop.Common.
Я подключала через Add Reference на вкладке COM библиотеку AutoCAD. И в последующем коде, т. е. внутри namespace проекта, через AutoCAD. я могу создавать различные объекты классов, доступные через эту точку.
Например, к AcadApplication, AcadPolyline,AddPolyline,AddRegion, AcadRegion доступ непосредственно через AutoCAD..
А вот ApplicationServices не могу найти через AutoCAD.. Может Вы еще что-нибудь подключали?
  P.S. У меня MVS .NET 7, а AutoCAD 2002. Может это тоже играет свою роль?

Re: AutoCAD 2002. MVS .NET 7. Как нарисовать замкнутую полилинию?

> Юля
Я проверял это в AutoCAD 2006 с VS 2002. Вообще-то этот код я писал не как внешнее exe-приложение, а как dll - .NET-сборку, которая грузится в AutoCAD 2005 и 2006 при помощи команды NETLOAD. Для AutoCAD 2002 так сделать нельзя. Так что в Вашем варианте это будет выглядеть где-то так (детальнее нет времени проверять):

    static public void test(AutoCAD.AcadApplication acad)
    {
      AcadModelSpace ms = acad.ActiveDocument.ModelSpace;
      try {
        Double [] pts = {
                          0,  0, 0,
                          100,  0, 0,
                          100,100, 0,
                          0,100, 0
                        };
        AcadPolyline poly = ms.AddPolyline(pts);
        poly.Closed = true;
        AcadPolyline [] entlst = { poly };
        //----------------------------------------------------------------
        // Маленькая тонкость AddRegion — возвращается не AcadRegion,
        // а массив объектов, т.к. в результате может получится не один
        // регион или вообще не регион!
        //----------------------------------------------------------------
        Object[] regs = (Object[]) ms.AddRegion(entlst);
        poly.Erase(); // полилинию удаляем — она нам уже не нужна
        foreach (AcadRegion reg in regs) {
          // Выдавливаем регион и сразу его удаляем — он нам уже не нужен
          ms.AddExtrudedSolid(reg,100,0);
          reg.Erase();
        }
      }
      catch (System.Exception e) {
        acad.ActiveDocument.Utility.Prompt(e.ToString());
      }
    }

Считаем, что AutoCAD.AcadApplication acad где то уже определено и инициализированно.

Re: AutoCAD 2002. MVS .NET 7. Как нарисовать замкнутую полилинию?

Спасибо огромное!С использованием последнего варианта все получилось!
А где можно найти информацию по поводу синтаксиса записи Acad`овских методов, точнее их параметров?В документации,справках AutoCAD?
В папке Help AutoCAD`а есть справка acadauto,но там все описывается относительно VBA,что,в свою очередь,затрудняет перевести мне эти примеры кода на C#.

Re: AutoCAD 2002. MVS .NET 7. Как нарисовать замкнутую полилинию?

> Юля
Увы, Юля, но хорошего описания AutoCAD'овских методов применительно к C# нет. Особенно под старые версии AutoCAD, к которым уже относится и 2002-ой. Так что остается пользоваться окном Object Browser в Visual Studio (меню View->Other Windows->Object Browser или Ctrl+Alt+J) и там смотреть списки методов и их описание. Ну и спрашивать в конференциях. Кстати, вопрос по поводу AddRegion я встречал неоднократно в разных конференциях, а вот ответа на него - увы нет. Пришлось самому искать решение и отвечать :)

Re: AutoCAD 2002. MVS .NET 7. Как нарисовать замкнутую полилинию?

Спасибо за информацию.
Практически все приходится искать методом тыка или "авось" получится.
А что по поводу команды fillet?Как-нибудь через точку к ней можно добраться?
Я так поняла,что при указании ребра для скругления(ребро указывается с помощью точки в программе на C#),необходимо,чтобы это ребро было непосредственно открыто для наблюдения,таким же образом,как если бы мы стотрели на него при прямой работе в AutoCAD`е,т.е указали бы это ребро после приглашения Select an edge or [].А если оно скрыто за гранью или другим ребром,то Acad выбирает именно это попавшееся ему на пути ребро(грань).

Re: AutoCAD 2002. MVS .NET 7. Как нарисовать замкнутую полилинию?

> Юля
Насколько я знаю - именно так. Но с твердыми телами практически не работаю. А особенно в AutoCAD 2002! :)

Re: AutoCAD 2002. MVS .NET 7. Как нарисовать замкнутую полилинию?

Очень жаль...что так...