Перейти к содержанию

macrodaemon

nanoSoft
  • Публикаций

    18
  • Зарегистрирован

  • Посещение

Репутация

1 Обычный

Информация о macrodaemon

  • Звание
    Гуру MultiCAD API

Информация

  • Пол
    Мужчина

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

  1. 1) А что вас удивляет? Ваш класс Q обычный статический класс, при запуске нанокада он пустой, при закрытии документа с ним ничего не происходит, или вы предполагаете что все все сериализуемые классы автоматически сохраняются в документ? Это невозможно. Атрибут [Serializable] это штатный атрибут C# который указывает на _возможность_ сериализации. В документ сохраняются только объекты добавленные в документ, наследники McCustomBase. Или данные установленные в MCDocument.ObjectProperties 2) GlobalEvents
  2. Подключитесь реактору ObjectAppended перед разбитием вставок и получите весь список добавленных в документ объектов. Как планируете разбивать, через посыл команды?
  3. тип который у вас является ссылкой на объект 2 должен быть сериализуемым. т.е. должен иметь атрибут [serializable] (т.е. само определение типа должно иметь атрибут [serializable]) Нет он не должен быть наследником какого либо класса. Все как в обычной сериализации. Возможно у него что то с конструкторами, смотрите какие эксепшены полетают. Или создайте тестовую функцию для сериализации во внешний документ и тогда сможет поймать эксепшен сами и посмотреть в чем проблема. McEntity entity = YorCustomBaseClassObject; MemoryStream ms = new MemoryStream(); BinaryFormatter formatter = new BinaryFormatter(); try { formatter.Serialize(ms, entity); ms.Position = 0; McEntity newEnttity = (McEntity)formatter.Deserialize(ms); } catch (SerializationException e) { Console.WriteLine("Failed to serialize. Reason: " + e.Message); }
  4. Все сериализуемые поля должны сохранятся, вы что то сделали неправильно. Скорее всего среди филдов вашего класса есть несериализуемый тип (тип без атрибута [serializable]) и при этом он не помечен атрибутом [NonSerilize], поэтому при сохранении пролетает exception который ловится системой сериализации. Его можно увидеть при записи в output студии или запустив InDebMon.exe.
  5. Делайте просто DBLine line = currID.GetObject(); if(line != null) { } Там implicit конверсия и она приведет если тип подходит. или if(currObj.ClassID == DBline.TypeID) В 6 и 7 нанокаде ваша конструкция сработала бы. В 5 нанокаде еще не было приведения к конечному типу объекта и отдавалась реализация McObject, которая при implicit преобразованиях могла привестись в нужны класс. Все улучшается
  6. McObjectId id1 = McObjectManager.SelectObject("Select first line"); McObjectId id2 = McObjectManager.SelectObject("Select second line"); DbLine line1 = id1.GetObject(); DbLine line2 = id2.GetObject(); if(line1 != null && lne2 != null) { double Angle = line1.Line.Direction.GetAngleTo( line2.Line.Direction); double Line1Length = line1.Line.Length; double Line2Length = line2.Line.Length; }
  7. Работа с таблицами описана в: http://forum.nanocad.ru/index.php?showtopic=6510 http://forum.nanocad.ru/index.php?showtopic=6511 http://forum.nanocad.ru/index.php?showtopic=6512
  8. Есть 2 варианта, 1) традиционный локальный реактор между объектами, ObjectA.DBEntity.AddReactor(ObjectB.ID) , реакция придет в ObjectB.OnReactor 2) GlobalEvents.ObjectChanged
  9. Тут несколько моментов. 1) Вы пытаетесь добавить документ в документ, поэтому не срабатывает, в документ надо добавлять вставку блока. 2) И в целом не совсем подробное описание функции CreateBlock, она делает блок не из документа (по скольку в документе могут быть свои подблоки например много листов и т.п.) она копирует блок из исходного документа в выбранный, т.е. если бы в документе h:/sapr/block.dwg был блок "12", то он скопируется в документ doc. Впрочем у вас это и так происходит, значит там есть такой блок. Поэтому ваш пример должен выглядеть примерно так: Я распишу тут сразу все варианты. Если в документе h:/sapr/block.dwg есть блок под именем "12" и вы хотите скопировать его в текущий документ и сделать его вставку. McDocument doc = McDocumentsManager.GetActiveSheet(); McDocument refDoc = McDocumentsManager.OpenDocument(@"h:/sapr/block.dwg", false, true); doc.CreateBlock("12", refDoc); McBlockRef refBlk = new McBlockRef(); refBlk.BlockName = "12"; refBlk.DbEntity.AddToCurrentDocument(); Если вам нужен xref McDocument doc = McDocumentsManager.GetActiveSheet(); doc.AttachXRef(@"h:/sapr/block.dwg", "12"); McBlockRef refBlk = new McBlockRef(); refBlk.BlockName = "12"; refBlk.DbEntity.AddToCurrentDocument(); Если вы хотите скопировать все например из ModelSpace документа h:/sapr/block.dwg в блок "12" активного документа и вставить вставку. McDocument doc = McDocumentsManager.GetActiveDoc();//здесь нужен именно GetActiveDoc а не GetActiveSheet McDocument refDoc = McDocumentsManager.OpenDocument(@"h:/sapr/block.dwg", false, true); //Получаем список всех layout List<mcobjectid> sheetsId = refDoc.GetSheets(); McDocument modelSpace = null; foreach (McObjectId idSheet in sheetsId) { //находим Model McDocument sheet = idSheet.GetObject(); if(sheet.IsModel){ modelSpace = sheet; break; } } //копируем в блок "12" modelSpace.CopyObjects(doc, "12"); McBlockRef refBlk = new McBlockRef(); refBlk.BlockName = "12"; refBlk.DbEntity.AddToCurrentDocument();
  10. с картинками увы не получиться. Типы линий - это специальный нативный тип контрола в каде.
  11. namespace DotNetSample { // Пример работы с мешем на примере построения кубика [CustomEntity(typeof(DotNetSample.MeshCube), "27D890D4-296B-45EB-801D-2666183DA272", "MeshCube", "Пример мультикадовского меша")] [serializable] public class MeshCube : McCustomBase { /// <summary> /// Простой способ получить ID класса, используется в конструкциях ObjectFlter.AddType(class.TypeID) или obj.IsKindOf(class.TypeID) /// </summary> public static new Guid TypeID { get { return GetTypeID(typeof(MeshCube)); } } Point3d _origin = Point3d.Origin; List<Mesh> CreateMeshCube() { List<Mesh> list = new List<Mesh>(); Mesh wrap1 = new Mesh(2, 4); byte color = 255; for (int i = 0; i < 2; i++) { int val = 1; if (i == 1) val = -1; wrap1.Vertices[i][0].Coordinate = new Point3d(-1, -1, val); wrap1.Vertices[i][0].Color = Color.FromArgb(0, 0, color); wrap1.Vertices[i][1].Coordinate = new Point3d(-1, 1, val); wrap1.Vertices[i][1].Color = Color.FromArgb(0, 0, color - 10); wrap1.Vertices[i][2].Coordinate = new Point3d(1, 1, val); wrap1.Vertices[i][2].Color = Color.FromArgb(0, 0, color - 20); wrap1.Vertices[i][3].Coordinate = new Point3d(1, -1, val); wrap1.Vertices[i][3].Color = Color.FromArgb(0, 0, color - 30); } for (int i = 0; i < 2; i++) { wrap1.Edges.Horizontal[i][0].Color = Color.FromArgb(0, 0, color); wrap1.Edges.Horizontal[i][1].Color = Color.FromArgb(0, 0, color - 10); wrap1.Edges.Horizontal[i][2].Color = Color.FromArgb(0, 0, color - 20); } wrap1.Edges.Vertical[0][0].Color = Color.FromArgb(0, 0, color); wrap1.Edges.Vertical[1][0].Color = Color.FromArgb(0, 0, color - 10); wrap1.Edges.Vertical[2][0].Color = Color.FromArgb(0, 0, color - 20); wrap1.Edges.Vertical[3][0].Color = Color.FromArgb(0, 0, color - 30); wrap1.Faces[0][0].Normal = new Vector3d(-1, 0, 0); wrap1.Faces[0][0].Color = Color.FromArgb(0, 0, color); wrap1.Faces[0][1].Normal = new Vector3d(0, 1, 0); wrap1.Faces[0][1].Color = Color.FromArgb(0, 0, color - 10); wrap1.Faces[0][2].Normal = new Vector3d(1, 0, 0); wrap1.Faces[0][2].Color = Color.FromArgb(0, 0, color - 20); Matrix3d tfm = Matrix3d.Rotation(Math.PI, Vector3d.XAxis, Point3d.Origin); Matrix3d tfm2 = Matrix3d.Rotation(Math.PI / 2.0, Vector3d.YAxis, Point3d.Origin); Mesh wrap2 = new Mesh(wrap1); wrap2.TransformBy(tfm2 * tfm); list.Add(wrap1); list.Add(wrap2); return list; } public MeshCube() { } public override void OnDraw(GeometryBuilder dc) { int iGsMarker = 1; if (dc.Container.Count == 0) { //добавляем 1 раз, если не делать dc.Clear(); то они там и будут лежать List<Mesh> list = CreateMeshCube(); foreach (Mesh partMesh in list) { EntityGeometry part = new EntityGeometry(partMesh); dc.DrawGeometry(part, iGsMarker++); } } } public override bool GetECS(out Matrix3d tfm) { tfm = Matrix3d.Displacement(_origin.GetAsVector()); return true; } public override void OnTransform(Matrix3d tfm) { if (!TryModify()) return; _origin = _origin.TransformBy(tfm); } public override List<Point3d> OnGetGripPoints() { List<Point3d> points = new List<Point3d>(); points.Add(_origin); return points; } public override void OnMoveGripPoints(List<int> indexes, Vector3d offset, bool isStretch) { _origin = _origin.TransformBy(Matrix3d.Displacement(offset)); } public override hresult PlaceObject(PlaceFlags lInsertType) { McUndoPoint undo = new McUndoPoint(); undo.Start(); InputJig jig = new InputJig(); DbEntity.AddToCurrentDocument(); jig.MouseMove = (s, a) => { TryModify(); _origin = a.Point; DbEntity.Update(); }; InputResult res = jig.GetPoint("Enter point to Ending process"); return hresult.s_Ok; } public override hresult OnEdit(Point3d pnt, EditFlags lInsertType) { return hresult.s_Ok; } [CommandMethod("smplMeshCube", CommandFlags.NoCheck | CommandFlags.NoPrefix)] static public void smplMeshCube() { MeshCube obj = new MeshCube(); obj.PlaceObject(); } } }
  12. "Даже если вручную ставлю, к примеру, М4:1." У вас выполняется эта команда, вы в дебагере ставили там брекпоинт, заходит туда? По идее в атрибуте у вас не хватает флага CommandFlags.NoCheck что бы команда успешно зарегистрировалась, и я бы рекомендовал вам назвать команду посложнее testScale например. Вот вы написали M4:1 "M" - большое, вероятно вы выбрали машиностроительный режим нанокада? Там где вы вручную задаете масштаб, в меню внизу галочка стоит у "Масштаб символов" или "Масштаб измерений" ? В нанокаде 2 масштаба, масштаб элементов оформления и масштаб модели. Концепция такова: в машиностроительном обычно рисуют деталь в нужном масштабе, а элементы оформления - 1:1 в строительной области рисуют чертеж 1:1 а оформление делают в нужном масштабе. Бывает используют оба одновременно, поэтому нужны оба отдельно. Так вот: McObjectManager.CurrentStyle.Scale - масштаб элементов оформления (например m100:1) McObjectManager.CurrentStyle.MeasureScale - масштаб измерений. (например M4:1) [CommandMethod("TestScl", CommandFlags.NoCheck | CommandFlags.NoPrefix)] public void TestScl() { double ScaleDwg = McObjectManager.CurrentStyle.MeasureScale .Scale; ScaleDwg = .25; McObjectManager.CurrentStyle.Scale = ScaleDwg; } Работает прекрасно.
  13. Через атрибут TypeConverter /// <summary> /// TypeConverter для списка должностей /// </summary> class MCETypeConverter : StringConverter { /// <summary> /// Будем предоставлять выбор из списка /// </summary> public override bool GetStandardValuesSupported( ITypeDescriptorContext context) { return true; } /// <summary> /// ... и только из списка /// </summary> public override bool GetStandardValuesExclusive( ITypeDescriptorContext context) { // false - можно вводить вручную // true - только выбор из списка return false; } /// <summary> /// А вот и список /// </summary> public override StandardValuesCollection GetStandardValues( ITypeDescriptorContext context) { YourEntity obj = context.Instance as YourEntity; if (obj != null) { return new StandardValuesCollection(obj.TextVariantes); } return null; } } ..... [TypeConverter(typeof(MCETypeConverter))] public String Text2 { get { return _Text2; } set { if (!TryModify()) return;//без этого не будет сохранятся Undo и перерисовыватся объект _Text2 = value; } } Не забывайте что в методе set надо вызывать TryModify для корректной перерисовки и записи Undo состояния объекта
  14. К сожалению не могу ничего подсказать про LibreOffice. А в целом лучше на .net сейчас делать, там возможностей больше. Можно свои объекты писать, есть доступ ко всем символам оформления. Референсить mapimgd.dll. Кое какие примеры есть в чистом нанокаде. Добавим примеры и в следующий наноСПДС. McCOM2 это не MultiCAD, COM сейчас не развивается.
×
×
  • Создать...