| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > .NET C# вставка блока из внешнего файла

.NET C# вставка блока из внешнего файла

Ответ
Поиск в этой теме
Непрочитано 08.06.2018, 17:54 #1
.NET C# вставка блока из внешнего файла
Unfamous
 
Визайнер-дизуализатор в отставке
 
Регистрация: 12.11.2009
Сообщений: 133

Добрый день!
Бьюсь над тривиальной задачей, но без сторонней помощи видать не выйдет. Мне надо в чертеж вставить блок из внешнего файла, который записан с помощью WBLOCK. Т.е. во внешнем файле по факту блока нет, но если его вставить с помощью INSERT вставиться блок.
Я смог это написать на VBA:
Код:
[Выделить все]
Set insBlock = ThisDrawing.ModelSpace.InsertBlock(insPnt, PathToDwg, 1, 1, 1, curBlock.Rotation)
А вот на C# никак - запутался в транзакциях, базах, .insert, .wblock...
Подтолкните в нужном направлении, пожалуйста
__________________
Жизнь не сахар, а смерть нам не чай... © Ю.Шевчук
Просмотров: 8250
 
Непрочитано 08.06.2018, 18:27
#2
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


http://adndevblog.typepad.com/autoca...sing-net-.html и то же на русском http://adn-cis.org/vstavka-bloka-iz-...hhyu-.net.html
На сколько я понял код, там в таблице блоков внешнего файла ищется BlockTableRecord нужного Вам блока и копируется в Ваш файл...
Вам остается на его основе создать BlockReference и разместить его в пространстве чертежа
Посмотрите последнее собщение тут: https://forums.autodesk.com/t5/net/i...c/td-p/2006010

Последний раз редактировалось Boxa, 08.06.2018 в 18:35.
Boxa вне форума  
 
Непрочитано 08.06.2018, 19:13
#3
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Я так понял, что надо весь файл вставить как новый блок.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 08.06.2018, 21:36
#4
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Странно, что автор топика не умеет пользоваться поиском... поиск в яндексе по строке "C# insert wblock dwg in to dwg"
четвертая ссылка: forums.augi.com/showthread.php?107653-How-to-insert-a-DWG-file-as-a-block
и еще https://forums.autodesk.com/t5/net/i...k/td-p/2495644
https://stackoverflow.com/questions/...urrent-drawing (см. последний ответ)

Последний раз редактировалось Boxa, 08.06.2018 в 21:44.
Boxa вне форума  
 
Автор темы   Непрочитано 11.06.2018, 09:39
#5
Unfamous

Визайнер-дизуализатор в отставке
 
Регистрация: 12.11.2009
Сообщений: 133


Цитата:
Сообщение от Boxa Посмотреть сообщение
Странно, что автор топика не умеет пользоваться поиском
Абсолютно ничего странного Поиск пользовать умею, и копался с этой задачей полдня выдергивая варианты из поисковика. Беру первый попавшийся вариант с вашего первого поста:

Код:
[Выделить все]
Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
string blockPath = @"d:\test.dwg";
                using (Database OpenDb = new Database(false, true))
                {
                    OpenDb.ReadDwgFile(blockPath, System.IO.FileShare.ReadWrite, true, "");
                    ObjectIdCollection ids = new ObjectIdCollection();
                    using (Transaction tr = OpenDb.TransactionManager.StartTransaction())
                    {
                        //For example, Get the block by name "TEST"
                        BlockTable bt;
                        bt = (BlockTable)tr.GetObject(OpenDb.BlockTableId, OpenMode.ForRead);
                        if (bt.Has("test"))
                        {
                            ids.Add(bt["test"]);
                        }
                        tr.Commit();
                    }
                    //if found, add the block
                    if (ids.Count != 0)
                    {
                        //get the current drawing database
                        Database destdb = doc.Database;
                        IdMapping iMap = new IdMapping();
                        destdb.WblockCloneObjects(ids, destdb.BlockTableId, iMap, DuplicateRecordCloning.Ignore, false);
                    }
                }
И ничего не происходит

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Я так понял, что надо весь файл вставить как новый блок.
Да, именно так. В вставляемом файле блока нет, но файл сделан с помощью WBLOCK, поэтому если его вставлять через INSERT, то вставляется блок с именем вставляемого файла и нужной точкой вставки
__________________
Жизнь не сахар, а смерть нам не чай... © Ю.Шевчук

Последний раз редактировалось Unfamous, 11.06.2018 в 10:10.
Unfamous вне форума  
 
Непрочитано 11.06.2018, 09:49
#6
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от Unfamous Посмотреть сообщение
И ничего не происходит
и не будет происходить, так как в этом коде описывается вставка блока, а не dwg файла. Однако, если бы вы посмотрели последнюю ссылку в 4 сообщении (я написал куда именно смотреть), то может быть дело сдвинулось бы, но видимо не очень то и нужно...
Boxa вне форума  
 
Автор темы   Непрочитано 11.06.2018, 10:14
#7
Unfamous

Визайнер-дизуализатор в отставке
 
Регистрация: 12.11.2009
Сообщений: 133


Цитата:
Сообщение от Boxa Посмотреть сообщение
но видимо не очень то и нужно...
Сарказм с вас так и хлещет) Надо, ибо зачем я трачу свое время, и тем более бесценное время форумчан?

Код:
[Выделить все]
string blockPath = @"d:\test.dwg";
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            using (Transaction Trans = db.TransactionManager.StartTransaction())
            {
                BlockTable BlkTbl = Trans.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
                using (Database tempDb = new Database(false, true))
                {
                    tempDb.ReadDwgFile(blockPath, System.IO.FileShare.Read, true, null);
                    db.Insert("test", tempDb, true);
                }
                Trans.Commit();
            }
Что-то такое приводит к фатал эрору
__________________
Жизнь не сахар, а смерть нам не чай... © Ю.Шевчук
Unfamous вне форума  
 
Непрочитано 11.06.2018, 10:43
#8
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


OpenDb.WblockCloneObjects(ids, destdb.BlockTableId, iMap, DuplicateRecordCloning.Ignore, false);
trir вне форума  
 
Непрочитано 11.06.2018, 10:48
#9
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от Unfamous Посмотреть сообщение
Сарказм с вас так и хлещет) Надо, ибо зачем я трачу свое время, и тем более бесценное время форумчан?
И понятно почему, я потратил свое время и нашел для Вас полностью готовый метод, по вставке файлов созданных с помощью команды WBLOCK, а Вы в упор не видите этого и продолжаете задавать вопросы. Сейчас специально взял этот метод и протестировал, все работает без сбоев, файл вставляется, о чем тут еще говорить не понятно, остается только шутить, что я и делаю =о)
Boxa вне форума  
 
Автор темы   Непрочитано 11.06.2018, 11:12
#10
Unfamous

Визайнер-дизуализатор в отставке
 
Регистрация: 12.11.2009
Сообщений: 133


Цитата:
Сообщение от Boxa Посмотреть сообщение
а Вы в упор не видите этого и продолжаете задавать вопросы
Я начал тему с этого "Бьюсь над тривиальной задачей, но без сторонней помощи видать не выйдет", т.к. не обладаю таким опытом как Ваш, и расковырять ваш пример не хватает мозгов, а не от того, что у меня нет желания посмотреть.

Как подправить упрощенный код, чтобы не было фатал эрора? Вроде открываю таблицу блоков для записи, добавляю туда блок, но видать что-то не так
__________________
Жизнь не сахар, а смерть нам не чай... © Ю.Шевчук
Unfamous вне форума  
 
Непрочитано 11.06.2018, 11:44
1 | #11
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Подправить... было бы что править...
Если для Вас взять готовый код и использовать - сложно, то может стоит начать с чего нибудь по проще?
Вложения
Тип файла: zip InsertWBLOCK.zip (29.1 Кб, 75 просмотров)
Boxa вне форума  
 
Автор темы   Непрочитано 11.06.2018, 14:57
#12
Unfamous

Визайнер-дизуализатор в отставке
 
Регистрация: 12.11.2009
Сообщений: 133


Цитата:
Сообщение от Boxa Посмотреть сообщение
Подправить... было бы что править...
Так вроде в посте #7 выложил попытку. Вы наверное не заметили. И она оказалась рабочей, вот только в моем проекте автокад валиться с фатал эрором, а в вашем нет.
__________________
Жизнь не сахар, а смерть нам не чай... © Ю.Шевчук
Unfamous вне форума  
 
Непрочитано 11.06.2018, 15:14
#13
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


пошагово в отладчике пройдите до фатала. Заодно полезно для изучения)
Сергей812 вне форума  
 
Автор темы   Непрочитано 11.06.2018, 15:27
#14
Unfamous

Визайнер-дизуализатор в отставке
 
Регистрация: 12.11.2009
Сообщений: 133


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
пошагово в отладчике пройдите до фатала. Заодно полезно для изучения)
Еще пока не научился)))
Процедура была запихнута в класс CommandHandler_btn, и запускалась в Execute. Переместив ее в класс с командами она заработала. А как тогда это на кнопку посадить?

UPD:
Разобрался, надо блокировать документ переде тем как писать в таблицу. Сергей натолкнул на отладку, а в отладке выдало конкретную ошибку.
Код:
[Выделить все]
App.Document doc = App.Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            string blockname = "Drawing1";
            using (var inMemoryDb = new Database(false, true))
            {
                inMemoryDb.ReadDwgFile("D:\\Drawing1.dwg", System.IO.FileShare.Read, true, "");
                using (var transaction = db.TransactionManager.StartTransaction())
                {
                    using (doc.LockDocument())
                    { 
                        BlockTable destDbBlockTable = (BlockTable)transaction.GetObject(db.BlockTableId, OpenMode.ForRead);
                        BlockTableRecord destDbCurrentSpace = (BlockTableRecord)db.CurrentSpaceId.GetObject(OpenMode.ForWrite);
                        ObjectId sourceBlockId;
                        sourceBlockId = db.Insert(blockname, inMemoryDb, true);
                    }
                    transaction.Commit();
                }
            }
Всем спасибо за помощь. Задача вроде и тривиальная, но надо делать много телодвижений. И надо углубляться, чтобы понять что происходит. Всем удачи
__________________
Жизнь не сахар, а смерть нам не чай... © Ю.Шевчук

Последний раз редактировалось Unfamous, 11.06.2018 в 15:45.
Unfamous вне форума  
 
Непрочитано 11.06.2018, 16:01
#15
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


создайте команду и вешайте на кнопку аналогично любому лиспу
Сергей812 вне форума  
 
Автор темы   Непрочитано 11.06.2018, 16:08
#16
Unfamous

Визайнер-дизуализатор в отставке
 
Регистрация: 12.11.2009
Сообщений: 133



Я с VBA перехожу на C# для того, чтобы можно было цивилизовано поделать кнопки на рибоне. Не охота каждому пользователю ходить кнопки настраивать
__________________
Жизнь не сахар, а смерть нам не чай... © Ю.Шевчук
Unfamous вне форума  
 
Непрочитано 12.06.2018, 06:59
#17
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от Unfamous Посмотреть сообщение
Не охота каждому пользователю ходить кнопки настраивать
Хорошим тоном, в этом случае, является создание CUIX пакета с кнопками.
Boxa вне форума  
 
Автор темы   Непрочитано 12.06.2018, 09:26
#18
Unfamous

Визайнер-дизуализатор в отставке
 
Регистрация: 12.11.2009
Сообщений: 133


Цитата:
Сообщение от Boxa Посмотреть сообщение
Хорошим тоном, в этом случае, является создание CUIX пакета с кнопками.
Может я что-то упустил, когда выбирал реализацию своей задачи. С помощью .net надстройки и простенького скрипта, который сделает нужные записи в реестре, я могу передать надстройку любому пользователю. Надстройка может храниться на сетевом ресурсе, и ее время от времени можно будет подменять. Можно пойти дальше, и написать надстройку, которая будет подгружать из сети новые версии для нужного автокада, но если честно это слишком большой замах для моей пока простой задачи. А чем может похвастаться CUIX пакет?
__________________
Жизнь не сахар, а смерть нам не чай... © Ю.Шевчук
Unfamous вне форума  
 
Непрочитано 12.06.2018, 10:52
#19
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от Unfamous Посмотреть сообщение
Надстройка может храниться на сетевом ресурсе, и ее время от времени можно будет подменять.
А Вы попробуйте. Когда надоест выключать автокад на всех компах, для обновления утилиты, придет просветление.

Цитата:
Сообщение от Unfamous Посмотреть сообщение
Можно пойти дальше, и написать надстройку, которая будет подгружать из сети новые версии для нужного автокада, но если честно это слишком большой замах для моей пока простой задачи.
Можно. Не Вы первый, не Вы последний... Вам ссылку дать на подобный проект?

Цитата:
Сообщение от Unfamous Посмотреть сообщение
А чем может похвастаться CUIX пакет?
Разделением кода и интерфейса. Пользователь сам может настроить интерфейс так как ему удобно. Независимость от версии автокада. Независимость от панелек или ленты. Продолжать или этого пока достаточно?

Вы действительно что то упустили, например стоит посмотреть на то, как рекомендует автодеск упаковывать программы для распространения, я имею ввиду .bundle пакеты. Там никакого скрипта не нужно, просто складываете все вместе: dll, cuix и другие ресурсы, описываете их в xml файл и все дальше автокад все сделает сам, и загрузит нужную версию dll, и cuix подгрузит и все остальное.
Boxa вне форума  
 
Автор темы   Непрочитано 12.06.2018, 12:17
#20
Unfamous

Визайнер-дизуализатор в отставке
 
Регистрация: 12.11.2009
Сообщений: 133


Цитата:
Сообщение от Boxa Посмотреть сообщение
А Вы попробуйте. Когда надоест выключать автокад на всех компах, для обновления утилиты, придет просветление.
К этому готов. Пока для сетевого использования пользователей около 5, и автокад не основной рабочий инструмент, поэтому проблем с этим минимум. И опять таки повторюсь, есть конкретные реализации, когда .net сборка подгружает другую .net, если были изменения.
Цитата:
Сообщение от Boxa Посмотреть сообщение
Вы действительно что то упустили, например стоит посмотреть на то, как рекомендует автодеск упаковывать программы для распространения, я имею ввиду .bundle пакеты. Там никакого скрипта не нужно, просто складываете все вместе: dll, cuix и другие ресурсы, описываете их в xml файл и все дальше автокад все сделает сам, и загрузит нужную версию dll, и cuix подгрузит и все остальное.
Про bundle пакеты читал, и реализация мне показалась сложнее, чем сделать пару кнопок, пускай не настраиваемых (что по большому счету в моей ситуации и не нужно), в рибоне .net сборкой. До этого вы жаловались на меня, что я взялся за сложную задачу, не потренировавшись на более простых. И в то же время предлагаете взяться за реализацию сложной задачи Возможно в каком-то будущем возьмусь все переделать под bundle пакет свое детище, сделав его вершиной программного мастерства, но пока это 1-2 кнопки, которые делают не очень та и сложные операции, но облегчающие рутинные задачи в разы. Спасибо за критику, возьму на заметку ваши рекомендации.
__________________
Жизнь не сахар, а смерть нам не чай... © Ю.Шевчук
Unfamous вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > .NET C# вставка блока из внешнего файла

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
.NET C# Как правильно получить BlockDefinition зная имя блока? valerik88 .NET 12 12.05.2017 16:21
Как удалить описание блока из файла? valrond Программирование 5 16.02.2016 16:30
Обновление/замена блока с таким же именем из другого файла. Pesec AutoCAD 2 11.11.2009 19:33
Вставка динамического блока с определёнными параметрами. Shade Динамические блоки 2 25.09.2007 15:20
Вставка таблицы внутри анонимного блока Кулик Алексей aka kpblc Программирование 7 21.06.2006 15:05