Ivanco 140 Опубликовано 11 сентября, 2020 Жалоба Поделиться Опубликовано 11 сентября, 2020 Вопрос "за 1000") Как МАКСИМАЛЬНО БЫСТРО читать информацию с dwg? условно. есть 5000 чертежей dwg. надо прочитать кол-во блоков в каждом из них. какие подходы вообщем применимы для такой задачи? не обязательно в рамках nanoCAD а вообще. операции только на чтение. понятно что можно открывать в CAD и читать через API информацию - но это капец долго. также интересно для формата IFC. Цитата Ссылка на сообщение Поделиться на другие сайты
Robink 76 Опубликовано 11 сентября, 2020 Жалоба Поделиться Опубликовано 11 сентября, 2020 Два пути только: 1. Через API. 2. Читать DXF файлы. Можно ускорить процесс, через запуск нескольких NC, а там, смотря сколько ядер у процессора, и сколько может дать файловая система. Цитата Ссылка на сообщение Поделиться на другие сайты
Robink 76 Опубликовано 11 сентября, 2020 Жалоба Поделиться Опубликовано 11 сентября, 2020 По мне так цифра 5000 не шибко страшная. Я правда не несколько тысяч, но несколько сотен документов обрабатывал, выполняя в них довольно тяжелую команду. Цитата Ссылка на сообщение Поделиться на другие сайты
Ivanco 140 Опубликовано 11 сентября, 2020 Автор Жалоба Поделиться Опубликовано 11 сентября, 2020 1 час назад, Robink сказал: Два пути только: 1. Через API. 2. Читать DXF файлы. Можно ускорить процесс, через запуск нескольких NC, а там, смотря сколько ядер у процессора, и сколько может дать файловая система. перебор файлов через конкретный CAD связан с кучей накладных проблем (открытие, отрисовка графики, че то пошло не так и т.д. и т.п.) и блин долго. dxf как бэ - фиг знает что там пропало по пути из dwg. а вот библиотеки ODA (понятно что они платные и я их не куплю) они позволяют организовать некий без интерфейсный доступ к файлу на уровне прямых запросов к DWG как к БД? или все ж таки файл по факту будет прочитан весь(читай открыт) и на это уйдет основное время? Цитата Ссылка на сообщение Поделиться на другие сайты
dows 545 Опубликовано 11 сентября, 2020 Жалоба Поделиться Опубликовано 11 сентября, 2020 Как я понимаю, DWG - это все-таки файл, а не база данных. Поэтому никаких запросов, а открыть, разместить в памяти, отфильтровать объекты, перебрать их и найти нужный тип блоков. Но может разработчики и поправят меня... Цитата Ссылка на сообщение Поделиться на другие сайты
EdwardSt 147 Опубликовано 12 сентября, 2020 Жалоба Поделиться Опубликовано 12 сентября, 2020 Доступ к DWG - файлам , естественно, возможен только через библиотеки (та же тайга), либо самому нужно будет писать парсер со всем сопутствующим накладняком - скудная документация, версионность, отсутствие стандарта на формат и т.д.. Более перспективным видится все-таки работа через приложение с использованием API: пара ночей и 5к файлов будет перелопачено Цитата Ссылка на сообщение Поделиться на другие сайты
Robink 76 Опубликовано 12 сентября, 2020 Жалоба Поделиться Опубликовано 12 сентября, 2020 (изменено) 13 часов назад, Ivanco сказал: перебор файлов через конкретный CAD связан с кучей накладных проблем (открытие, отрисовка графики, че то пошло не так и т.д. и т.п.) и блин долго. dxf как бэ - фиг знает что там пропало по пути из dwg. а вот библиотеки ODA (понятно что они платные и я их не куплю) они позволяют организовать некий без интерфейсный доступ к файлу на уровне прямых запросов к DWG как к БД? или все ж таки файл по факту будет прочитан весь(читай открыт) и на это уйдет основное время? Вообщем можно читать БД без открытия документа и без графики, через API NC. Database db2 = new Database(false, true); db2.ReadDwgFile(PathToFile, System.IO.FileShare.Read, true, ""); Изменено 12 сентября, 2020 пользователем Robink 2 Цитата Ссылка на сообщение Поделиться на другие сайты
Ivanco 140 Опубликовано 12 сентября, 2020 Автор Жалоба Поделиться Опубликовано 12 сентября, 2020 4 часа назад, Robink сказал: Вообщем можно читать БД без открытия документа и без графики, через API NC. Database db2 = new Database(false, true); db2.ReadDwgFile(PathToFile, System.IO.FileShare.Read, true, ""); спасибо буду пробовать. Цитата Ссылка на сообщение Поделиться на другие сайты
Robink 76 Опубликовано 12 сентября, 2020 Жалоба Поделиться Опубликовано 12 сентября, 2020 (изменено) В примере находятся вхождения блока и удаляются и еще определение блока убирается из документа. using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite); if (bt.Has(type1 + "_" + GetLegal(brand1) + "_" + GetLegal(model1) + "_РАМКИ_ВИДОВ")) { ObjectId BtrId = bt[type1 + "_" + GetLegal(brand1) + "_" + GetLegal(model1) + "_РАМКИ_ВИДОВ"]; BlockTableRecord Btr = (BlockTableRecord)tr.GetObject(BtrId, OpenMode.ForWrite); foreach (ObjectId BrId2 in Btr.GetBlockReferenceIds(true, true)) { BlockReference Br = (BlockReference)tr.GetObject(BrId2, OpenMode.ForWrite); Br.Erase(true); } Btr.Erase(true); } tr.Commit(); } Изменено 12 сентября, 2020 пользователем Robink Цитата Ссылка на сообщение Поделиться на другие сайты
Ivanco 140 Опубликовано 12 сентября, 2020 Автор Жалоба Поделиться Опубликовано 12 сентября, 2020 49 минут назад, Robink сказал: В примере находятся вхождения блока и удаляются и еще определение блока убирается из документа. да спасибо за изначальную подсказку, в принципе скорость приемлимая. некая свалка из 500 dwg обрабатывалась 14 минут. мне примерно такое надо : Спойлер Database db = new Database(false, true); Dictionary<string,int> allNames = new Dictionary<string, int>(); int badFiles = 0; foreach (string oneDwgPath in allDwgPaths) { try { db.ReadDwgFile(oneDwgPath, System.IO.FileShare.Read, true, ""); } catch (System.Exception) { badFiles++; continue; } using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; IEnumerable<BlockTableRecord> blockTableRecords = bt.Cast<ObjectId>() .Select(id => tr.GetObject(id, OpenMode.ForWrite) as BlockTableRecord) .Where(btr => btr != null) .Where(btr => btr.IsLayout == false); foreach (BlockTableRecord block in blockTableRecords) { if (!allNames.ContainsKey(block.Name)) { allNames.Add(block.Name, 1); } else { allNames[block.Name] = allNames[block.Name] + 1; } } } } Цитата Ссылка на сообщение Поделиться на другие сайты
Robink 76 Опубликовано 12 сентября, 2020 Жалоба Поделиться Опубликовано 12 сентября, 2020 Есть утечка памяти? db.Dispose() наверное еще нужен в конце. Цитата Ссылка на сообщение Поделиться на другие сайты
Ivanco 140 Опубликовано 12 сентября, 2020 Автор Жалоба Поделиться Опубликовано 12 сентября, 2020 (изменено) 52 минуты назад, Robink сказал: Есть утечка памяти? db.Dispose() наверное еще нужен в конце. насколько я понимаю использование using , Dispose() должен сам вызываться по умолчанию. или не? хотя во многих примерах кода по акад, Dispose() используется явно. Цитата с доков: Использование инструкции using обеспечивает вызов Dispose (или DisposeAsync), даже если в блоке using возникает исключение. https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/using-statement Изменено 12 сентября, 2020 пользователем Ivanco Цитата Ссылка на сообщение Поделиться на другие сайты
Robink 76 Опубликовано 12 сентября, 2020 Жалоба Поделиться Опубликовано 12 сентября, 2020 (изменено) Я про db она же объявлена и получается вне using. using (Database db = new Database(false, true)) { } Изменено 12 сентября, 2020 пользователем Robink Цитата Ссылка на сообщение Поделиться на другие сайты
Robink 76 Опубликовано 14 сентября, 2020 Жалоба Поделиться Опубликовано 14 сентября, 2020 По работе с IFC наверное нужно пробовать что то типа https://www.nuget.org/packages/Ifc.NET Цитата Ссылка на сообщение Поделиться на другие сайты
Ivanco 140 Опубликовано 14 сентября, 2020 Автор Жалоба Поделиться Опубликовано 14 сентября, 2020 В 13.09.2020 в 02:17, Robink сказал: Я про db она же объявлена и получается вне using. using (Database db = new Database(false, true)) { } да так скорее всего правильней. в моем коде объект db насколько понимаю просто уберется GC 'ом в конце. 2 часа назад, Robink сказал: По работе с IFC наверное нужно пробовать что то типа https://www.nuget.org/packages/Ifc.NET насколько понимаю этих IFC 10 штук разных еще, с IFC толком не ковырялся пока. Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.