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

Андрей Бушман

Клуб разработчиков
  • Публикаций

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

  • Посещение

  • Победитель дней

    1

Андрей Бушман стал победителем дня 24 декабря 2014

Андрей Бушман имел наиболее популярный контент!

Репутация

4 Обычный

Информация о Андрей Бушман

  • Звание
    Посетитель
  • День рождения 23.09.1978

Контакты

  • Сайт
    http://https://sites.google.com/site/bushmansnetlaboratory/
  • Skype
    Compositum78

Информация

  • Пол
    Мужчина
  • Город
    Санкт-Петербург
  1. Не то, чтобы я считал прикреплённый файл проблемным... Меня интересует, насколько серьёзны те ошибки, которые были найдены средствами восстановления nanoCAD? Во вложении находится DWG файл, для которого команда RECOVERY в разных CAD системах выдаёт разный результат. То, что результаты BricsCAD и nanoCAD несколько схожи, я приписываю тому, что они оба используют платформу Teigha. Меня несколько напрягает, что AutoCAD показывает другое. AutoCAD 2015 SP1 x64 Enu: nanoCAD 6.0 Plus: BricsCAD 14.2: test.dwg
  2. Я задал соответствующий вопрос на форуме ODA, т.к. похоже, что не всё гладко и в самой Teigha: http://forum.opendesign.com/showthread.php?14370-Purge-all-and-remove-unused-annotation-scales
  3. установил dwgcheck в 2, после этого recover (в акаде 2015) стал показывать ошибку (одну находит и исправляет)
  4. Кстати, в чистой "Тайге" версии 4.00.01 (автономное консольное приложение) всё работает успешно, без каких-либо аварий. Хотя, может и в Teigha не всё так гладко, как мне показалось: если затем полученный результат (DWG-файл, обработанный обозначенным кодом в Teigha) я открываю в nanoCAD или AutoCAD, то всё открывается успешно, но при попытке открыть его в BricsCAD получаю сообщения (см. вложенные файлы). В то же время Audit и Recovery в AutoCAD 2015 ошибок не находят в таком DWG.
  5. nanoCAD 6.0 Plus Для начала были написаны следующие методы расширения: /* © Andrey Bushman, 2014 * ExtensionMethods.cs */ using System; using System.Collections.Generic; using System.Linq; using System.Text; #if TEIGHA_CLASSIC using Db = Teigha.DatabaseServices; using Rt = Teigha.Runtime; using Gm = Teigha.Geometry; #endif #if NANOCAD using cad = HostMgd.ApplicationServices.Application; using Ap = HostMgd.ApplicationServices; using Ed = HostMgd.EditorInput; #elif BRICSCAD using cad = Bricscad.ApplicationServices.Application; using Ap = Bricscad.ApplicationServices; using Ed = Bricscad.EditorInput; #elif AUTOCAD using cad = Autodesk.AutoCAD.ApplicationServices.Application; using Ap = Autodesk.AutoCAD.ApplicationServices; using Db = Autodesk.AutoCAD.DatabaseServices; using Ed = Autodesk.AutoCAD.EditorInput; using Rt = Autodesk.AutoCAD.Runtime; using Gm = Autodesk.AutoCAD.Geometry; #endif namespace Bushman.CAD { public delegate void WriteMessage(String format, params Object[] args); public static class ExtensionMethods { public static Db.ObjectId[] GetDBObjectIds(this Db.Database db) { Db.ObjectId[] ids = GetDBObjectIds(db, (n => true)); return ids; } public static Db.ObjectId[] GetDBObjectIds(this Db.Database db, Func<Db.ObjectId, Boolean> filter) { // Check arguments if (null == db) throw new ArgumentNullException("null == db"); if (null == filter) throw new ArgumentNullException("null == filter"); if (db.IsDisposed) throw new ArgumentException("true == db.IsDisposed"); // ------------------- Int32 approxNum = db.ApproxNumObjects; List<Db.ObjectId> ids = new List<Db.ObjectId>(); for (Int64 i = db.BlockTableId.Handle.Value; i < db.Handseed.Value && approxNum > 0; ++i) { Db.Handle h = new Db.Handle(i); Db.ObjectId id = Db.ObjectId.Null; Boolean parseResult = db.TryGetObjectId(h, out id); if (parseResult) { --approxNum; if (filter(id)) { ids.Add(id); } } } return ids.ToArray(); } public static Int64 PurgeAll(this Db.Database db, out Db.ObjectId[] notRemovedIds, out String errMsg) { // check args if (null == db) throw new ArgumentNullException("null == db"); if (db.IsDisposed) throw new ArgumentException("db.IsDisposed"); //-------------- Db.ObjectId[] ids = null; Db.ObjectIdCollection _ids = null; Int64 rmObjCount = 0; List<Db.ObjectId> errIds = new List<Db.ObjectId>(); StringBuilder sb = new StringBuilder(); do { ids = db.GetDBObjectIds(n => !n.IsErased && !n.IsEffectivelyErased && !errIds.Contains(n)); _ids = new Db.ObjectIdCollection(ids); db.Purge(_ids); using (Db.Transaction tr = db.TransactionManager .StartOpenCloseTransaction()) { foreach (Db.ObjectId id in _ids) { if (!id.IsErased && !id.IsEffectivelyErased) { Db.DBObject obj = tr.GetObject(id, Db.OpenMode .ForWrite, false, true); try { obj.Erase(); ++rmObjCount; } catch (Exception ex) { errIds.Add(id); sb.AppendFormat("ObjectId: {0}. ClassName = " + "\"{1}\". Error message: \"{2}\".\n", id, id.ObjectClass.Name, ex.Message); } } } tr.Commit(); } } while (0 != _ids.Count); notRemovedIds = errIds.ToArray(); errMsg = sb.ToString(); return rmObjCount; } } } Затем, на основе этих методов была написана команда: /* Commands.cs * © Andrey Bushman, 2014 */ using System; using System.Collections.Generic; using System.Linq; using System.Diagnostics; using System.IO; #if TEIGHA_CLASSIC using Db = Teigha.DatabaseServices; using Rt = Teigha.Runtime; using Gm = Teigha.Geometry; #endif #if NANOCAD using cad = HostMgd.ApplicationServices.Application; using Ap = HostMgd.ApplicationServices; using Ed = HostMgd.EditorInput; #elif BRICSCAD using cad = Bricscad.ApplicationServices.Application; using Ap = Bricscad.ApplicationServices; using Ed = Bricscad.EditorInput; #elif AUTOCAD using cad = Autodesk.AutoCAD.ApplicationServices.Application; using Ap = Autodesk.AutoCAD.ApplicationServices; using Db = Autodesk.AutoCAD.DatabaseServices; using Ed = Autodesk.AutoCAD.EditorInput; using Rt = Autodesk.AutoCAD.Runtime; using Gm = Autodesk.AutoCAD.Geometry; #endif [assembly: Rt.ExtensionApplication(typeof(Bushman.CAD.ProxyCommands))] [assembly: Rt.CommandClass(typeof(Bushman.CAD.ProxyCommands))] namespace Bushman.CAD { public sealed class ProxyCommands : Rt.IExtensionApplication { public void Initialize() { Ap.Document doc = cad.DocumentManager.MdiActiveDocument; if (null == doc) return; Ed.Editor ed = doc.Editor; ed.WriteMessage("\n{0}\n", Path.GetFileName(this.GetType().Assembly .Location)); ed.WriteMessage("{0}\n\n", "© Andrey Bushman, 2014"); ed.WriteMessage("{0}:\n", "Commands"); ed.WriteMessage("{0}\n\n", "purgeAll - purge all in the current" + "Database."); } public void Terminate() { } [Rt.CommandMethod("purgeAll", Rt.CommandFlags.Modal)] public void Command_PurgeAll() { Ap.Document doc = cad.DocumentManager.MdiActiveDocument; if (null == doc) return; Ed.Editor ed = doc.Editor; Db.Database db = doc.Database; using (doc.LockDocument()) { Db.ObjectId[] notRemovedIds = null; String errMsg = null; Int64 count = db.PurgeAll(out notRemovedIds, out errMsg); ed.WriteMessage("Removed objects count: {0}\n", count); #if DEBUG ed.WriteMessage(errMsg); ed.WriteMessage("Not removed objects count: {0}\n", notRemovedIds.Length); #endif } } } } В результате работы команды (текущая вкладка - Модель) получаем следующий вывод: После выполнения команды курсор мыши перестаёт отображаться в пространстве Model. Если курсор увести на палитры, то он появляется. При попытке запустить команду Audit (или любую др. команду), либо при попытке переключения на какой-нибудь Layout, получаем аварийное завершение работы nanoCAD.
  6. А самому сравнить? Предполагаю, что в nGeonika.pgp могут выноситься псевдонимы команд, специфичных для Geonika, в то время как в nCAD.pgp находятся общие псевдонимы, использующиеся как в базовой версии nanoCAD, так и во всех "вертикалках". Во всяком случае на мой взгляд такое разделение было бы весьма логично.
  7. Я обновил текст и исходный заметки в виду того, что получил ответ от технической поддержки BricsCAD по заданному мною вопросу. Теперь все команды работают в т.ч. и в BricsCAD.
  8. Для AutoCAD существует ARX расширение, написанное Александром Наумовичем Ривилисом, которое позволяет расчленять все ProxyEntity, а так же удалять все ProxyEntity и ProxyObjects из текущей базы данных чертежа. Опубликовываю свою версию .NET реализации данных операций, которая может быть успешно скомпилирована для AutoCAD, nanoCAD, BricsCAD, а так же для автономных приложений, использующих в своей работе платформу Teigha. Возможно кому-то данный код будет интересен в качестве примера того, как можно писать код, который будет успешно компилироваться под различные CAD системы, не требуя при этом внесения в код каких-либо дополнительных изменений. Написание кода в подобном стиле предоставляет возможность портирования существующих наработок в другие CAD системы с минимумом затрат. Конструктивные замечания по исходному коду приветствуются.
  9. Доброго времени суток. Один и тот же исходный .net код похожим образом выводит информацию в консоль AutoCAD и BricsCAD (через Editor.WriteMessage). Но с nanoCAD, к сожалению, дела обстоят иначе. В AutoCAD 2009: В BricsCAD 14.2: В nanoCAD 6.0: Во первых, как видим, nanoCAD вклинивает текстовую часть "от себя", которая в данном случае совершенно не к месту. Приходится выискивать во всём этом именно ту текстовую информацию, которая действительно нужна. Во вторых, вместо подобного нечитабельного текста (лепит в одну строку, без пробела, как видим) ожидалось получить текст такого, более читабельного вида:
  10. Доброго времени суток. Windows 7 SP1 x64 Rus nanoCAD 6.0.2768.1597 - ДЛЯ РАЗРАБОТКИ Сборка: 2426 На сегодняшний день полноценной поддержки полей (Fields) в nanoCAD 6.0 к сожалению нет. Текущая реализация подсвечивает поля (созданные в AutoCAD) серым фоном, но не обновляет их в случае обновления источника, с которым они связаны. Под "полноценной" я подразумеваю возможность в nanoCAD создавать поля (в однострочном\многострочном текстах и в атрибутах), редактировать эти поля, а так же их [полей] динамическое обновление в случае обновления свойства объекта, с которого поля считывают информацию (в AutoCAD это поведение настраивается в диалоговом окне Options, на вкладке User Preferences в группе Fields). Если я правильно понял представителей Нанософт, с которыми недавно общался, то в nanoCAD имеется какой-то свой механизм, аналогичный полям. Только вот я не понял, присутствует ли он в базовом nanoCAD, или же только в каких-то его "вертикалках"? Поиск в справке по ключевому слову "поле" ожидаемых результатов не дал. Если я ничего не напутал и обозначенный механизм действительно присутствует (пусть и не совместимый с полями AutoCAD), то где можно почитать подробную информацию о нём? P.S. Поля (Fields) являются весьма востребованным функционалом среди проектировщиков нашей компании, поскольку они [поля] широко используются как в наших таблицах, так и в блоках (как правило - динамических). Кроме того, поля активно используются в Callout Blocks, применяемых в подшивках (SheetSet). Отсутствие данного механизма будет весьма ощутимо для моих пользователей. С уважением, Андрей.
  11. В данный момент времени я сравниваю реализации PGP от Autodesk и от Нанософт. Как видим, я спрашиваю о наличии функционала, присутствующего у Autodesk. Не факт, что этим пользователи будут пользоваться, однако для себя я хочу чётко понять, присутствует ли аналогичная возможность в nanoCAD, чтобы суметь правильно ответить на этот вопрос пользователю, когда\если он придёт ко мне с ним. Отсутствие\наличие данного функционала не считаю критическим. Однако ответ на свой вопрос хотелось бы получить.
  12. Разные пользователи формируют по разному. Я помню, что видел у одного из таких пользователей назначенный им набор свойств для окружности. Там присутствовали диаметр, толщина линии, тип линии, и слой. Пользователь говорил, что ему удобно видеть эти свойства, как наиболее интересные (для окружностей) обычным наведением мышки на объект. Вы можете в AutoCAD глянуть перечень объектов и их свойств, доступных для настройки. Команда _CUI, группа настроек Rollower Tooltips. Там ещё присутствует более мощный инструмент - группа настроек Quick Properties, но это несколько другое. Там для каждого типа объекта можно так же формировать свой набор свойств (более богатый), которые пользователь хочет видеть возле курсора мышки при выделении объекта (и при необходимости их править).
×
×
  • Создать...