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

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

C# .net переопределение динамического блока из внешнего файла

Ответ
Поиск в этой теме
Непрочитано 05.10.2011, 11:17 #1
C# .net переопределение динамического блока из внешнего файла
bargool
 
Санкт-Петербург
Регистрация: 16.08.2006
Сообщений: 501

Есть динамический блок с атрибутами и прочими извращениями в текущем файле и в неком эталонном постороннем файле.
Необходимо обновить блок в текущем файле в соответствии с изменившимся эталоном.
Я догадался до такого способа, но может, можно сделать всё проще?
Код:
[Выделить все]
[CommandMethod("blockRedefine", CommandFlags.Session)]
public void blockRedefine()
{
	// "Текущий" документ
	currDwg = Application.DocumentManager.MdiActiveDocument;
	currDatabase = currDwg.Database;
	DocumentCollection docManager = Application.DocumentManager;
	//открываем файл с эталонным блоком в режиме для чтения
	Document frameDoc = docManager.Open(@"Путь до файла.dwg", true);
	Database frameDb = frameDoc.Database;
	ObjectIdCollection frameCollection = new ObjectIdCollection();
	using (DocumentLock docLock = frameDoc.LockDocument())
	{
		using (Transaction transaction = frameDb.TransactionManager.StartTransaction())
		{
			BlockTable frameBlockTable = (BlockTable)transaction.GetObject(frameDb.BlockTableId, OpenMode.ForRead);
			// Пытаемся открыть эталонный блок
			BlockTableRecord frameBlock = transaction.GetObject(frameBlockTable["Frame"], OpenMode.ForRead) as BlockTableRecord;
			// если получилось - описание блока есть, добавляем в ObjectIdCollection для переноса в "текущий" документ
			if (frameBlock != null)
			{
				frameCollection.Add(frameBlock.ObjectId);
			}
		}

	}
	// Переключаемся на "текущий документ"
	docManager.MdiActiveDocument = currDwg;
	using (DocumentLock docLock = currDwg.LockDocument())
	{
		using (Transaction transaction = currDatabase.TransactionManager.StartTransaction())
		{
			BlockTable blockTable = (BlockTable)transaction.GetObject(currDatabase.BlockTableId, OpenMode.ForRead);
			IdMapping idmapping = new IdMapping();
			// пишем определение эталонного блока в "текущий" файл с заменой
			frameDb.WblockCloneObjects(frameCollection, blockTable.ObjectId, idmapping, DuplicateRecordCloning.Replace, false);
			transaction.Commit();
		}
	}
	// закрываем уже ненужный файл с эталонным блоком
	frameDoc.CloseAndDiscard();
	// Теперь надо обновить уже вставленные вхождения блока. Следующая конструкция работает, но мне крайне не нравится
	currDwg.SendStringToExecute("attsync\n", true, false, false);
	currDwg.SendStringToExecute("n\n", true, false, false);
	currDwg.SendStringToExecute("Frame\n", true, false, false);
}
Есть ли более корректный способ обновления описания блока, и самое главное, как более корректно и безгеморройно обновить вхождения блока?
Код тестовый, за отсутствие должных проверок не бить

Последний раз редактировалось bargool, 05.10.2011 в 13:27.
Просмотров: 11588
 
Непрочитано 05.10.2011, 12:10
#2
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,283
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от bargool Посмотреть сообщение
Я догадался до такого способа, но может, можно сделать всё проще?
1. Не обязательно открывать "эталонный чертеж" как документ. Достаточно открыть только базу:
Код:
[Выделить все]
Database frameDb = new Database(false, true);
using (frameDb)
{
      try
      {
          frameDb.ReadDwgFile(@"Путь до файла.dwg",  System.IO.FileShare.Read,  false,  "" );
          // Тут твой код ...
      } 
      catch { }
}
2. Если запускаешь команды, то не забывай подчеркивание перед именем английской команды и опции команды - в локализованных AutoCAD твой код работать не будет.

Последний раз редактировалось Александр Ривилис, 05.10.2011 в 13:18.
Александр Ривилис вне форума  
 
Непрочитано 05.10.2011, 12:57
#3
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Попробуй такой вариант, вроде рабочий,
но не помню...
Код:
[Выделить все]
        [CommandMethod("_impblk", CommandFlags.Session | CommandFlags.Redraw)]
     
        public void test()
        {
            string DwgNm = @"c:\Test\bla.dwg";
            string blkNm = "TestBlock";
            Point3d insPt = new Point3d(100.0, 200.0, 0.0);
 
            Document AcDoc = Application.DocumentManager.MdiActiveDocument;
            Database acCurDb = AcDoc.Database;

            InsertDrawingAsBlock(AcDoc, DwgNm, blkNm, insPt);
        }

        public void InsertDrawingAsBlock(Document doc, string filepath, string blockname, Point3d ipt)
        {
            Database curdb = doc.Database;

            Editor ed = doc.Editor;

            DocumentLock loc = doc.LockDocument();

            using (loc)
            {

                Transaction tr = doc.TransactionManager.StartTransaction();

                using (tr)
                {
                    try
                    {
                        ObjectId blkid = default(ObjectId);
                        BlockTable bt = (BlockTable)tr.GetObject(curdb.BlockTableId, OpenMode.ForRead, false);


                        if (bt.Has(blockname))
                        {
                            Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(string.Format("Block \"{0}\" does already exist\nTry another name", blockname));
                            return;

                        }
                        BlockTableRecord btr = (BlockTableRecord)tr.GetObject(curdb.CurrentSpaceId, OpenMode.ForWrite);
                        Database db = new Database(false, true);

                        using (db)
                        {

                            db.ReadDwgFile(filepath, System.IO.FileShare.Read, false, "");

                            blkid = curdb.Insert(blockname, db, true);

                        }

                        if ((!bt.Has(blockname)))
                        {
                            Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(string.Format("Block \"{0}\" does not added to block table\nExit on Error", blockname));
                            return;

                        }
                        BlockTableRecord btrec = (BlockTableRecord)tr.GetObject(blkid, OpenMode.ForRead, false);


                        if (string.IsNullOrEmpty(btrec.Name))
                        {
                            btrec.UpgradeOpen();

                            btrec.Name = blockname;

                            btrec.DowngradeOpen();

                        }

                        BlockReference bref = new BlockReference(ipt, blkid);

                        Matrix3d mat = Matrix3d.Identity;

                        bref.TransformBy(mat);

                        bref.ScaleFactors = new Scale3d(2);//<--масштаб, к примеру

                        bref.Rotation = Math.PI / 4;//<--поворот блока, к примеру

                        btr.AppendEntity(bref);

                        tr.AddNewlyCreatedDBObject(bref, true);



                        if (btrec.HasAttributeDefinitions)
                        {
                            Autodesk.AutoCAD.DatabaseServices.AttributeCollection atcoll = bref.AttributeCollection;

                            foreach (ObjectId subid in btrec)
                            {
                                Entity ent = (Entity)subid.GetObject(OpenMode.ForRead);
                                AttributeDefinition attDef = ent as AttributeDefinition;

                                if (attDef != null)
                                {
                                    ed.WriteMessage( "\nValue: " + attDef.TextString);
                                    AttributeReference attRef = new AttributeReference();

                                    attRef.SetPropertiesFrom(attDef);

                                    attRef.Visible = attDef.Visible;

                                    attRef.SetAttributeFromBlock(attDef, bref.BlockTransform);
                                    attRef.HorizontalMode = attDef.HorizontalMode;

                                    attRef.VerticalMode = attDef.VerticalMode;

                                    attRef.Rotation = attDef.Rotation;

                                    attRef.TextStyle = attDef.TextStyle;

                                    attRef.Position = attDef.Position + ipt.GetAsVector();

                                    attRef.Tag = attDef.Tag;

                                    attRef.FieldLength = attDef.FieldLength;

                                    attRef.TextString = attDef.TextString;

                                    attRef.AdjustAlignment(curdb);

                                    atcoll.AppendAttribute(attRef);

                                    tr.AddNewlyCreatedDBObject(attRef, true);

                                }

                            }
                        }

                        ed.UpdateScreen();

                        tr.Commit();
                    }
                    catch (Autodesk.AutoCAD.Runtime.Exception ex)
                    {
                        Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(ex.ToString() + "\n" + ex.Message);
                    }
                }
            }

        }
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 05.10.2011, 13:25
#4
bargool


 
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 501
<phrase 1=


Александр Ривилис, спасибо, напрямую к базе обращаться гораздо лучше. А вот про SendStringToExecute - я бы хотел сделать это вообще без отправки команд в ком. строку, собственно, мой вопрос в основном в этом и заключается (BlockReference.ResetBlock, судя по описанию тут не подойдёт, если помнить, что это динамический блок?).
Олег (jr.), твой код решает другую задачу. Мне надо обновить существующий блок (с этим справился), а самый главный вопрос - как обновить отображение уже вставленных вхождений блока. Напомню, блок динамический. По жизни, это можно сделать через Design Center, выбрав нужный блок в другом файле и указав ему "Redefine only", но после этого опять же надо сделать attsync, что бы динамические элементы и атрибуты обновились в соответствии с новым описанием блока.
bargool вне форума  
 
Непрочитано 05.10.2011, 13:25
#5
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Цитата:
Сообщение от bargool Посмотреть сообщение
// Теперь надо обновить уже вставленные вхождения блока. Следующая конструкция работает, но мне крайне не нравится
currDwg.SendStringToExecute("attsync\n", true, false, false);
currDwg.SendStringToExecute("n\n", true, false, false);
currDwg.SendStringToExecute("Frame\n", true, false, false);
Тоже интересно, как это эффективно сделать.
Пока остановился на варианте из 3 поста, тут:
http://www.caduser.ru/forum/index.ph...D=49&TID=49224
Короче, вставляю новые блоки на место существующих.
Vildar вне форума  
 
Автор темы   Непрочитано 05.10.2011, 13:36
#6
bargool


 
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 501
<phrase 1=


Vildar, мощный монолог.. похоже, тоже проблема с рамками к чертежам?
Тоже вариант, но всё же считаю вопрос про замену attsync'у открытым
bargool вне форума  
 
Непрочитано 05.10.2011, 14:32
#7
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Цитата:
Сообщение от bargool Посмотреть сообщение
похоже, тоже проблема с рамками к чертежам?
Да ) Делаю альтернативу подшивке, наподобие альбомов в СПДС7.
Vildar вне форума  
 
Непрочитано 05.10.2011, 14:44
#8
Сергей Богатов


 
Регистрация: 21.02.2009
Сообщений: 825


Цитата:
Сообщение от Vildar Посмотреть сообщение
Да ) Делаю альтернативу подшивке, наподобие альбомов в СПДС7.
А чем не устроила подшивка? Взяв её за основу, можно с помощью программерства "приделать" те функции, которые нужны. Сам так и сделал. В том числе изменение рамок, автоподпись, проставление "ИЗМов", и т.п.
P.S.
Тоже остановился на
Код:
[Выделить все]
 
cFile.SendCommand "_ATTSYNC" & vbCr & "NAME" & vbCr & blk_Name & vbCr
__________________
Я-проектировщик бывший проектировщик!

Последний раз редактировалось Сергей Богатов, 05.10.2011 в 14:50.
Сергей Богатов вне форума  
 
Непрочитано 05.10.2011, 17:01
#9
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Сергей Богатов Посмотреть сообщение
Тоже остановился на
Код:
[Выделить все]
 
cFile.SendCommand "_ATTSYNC" & vbCr & "NAME" & vbCr & blk_Name & vbCr
Плохое решение.

Другой вариант решения:
Написать метод расширения static void AttSync(this BlockTableRecord btr, bool setAttDefValues, bool removeSuperfluous). Второй параметр указывает на то, следует ли во вхождениях блока перезаписать текущие значения AttributeReference на значения по умолчанию. Третий - следует ли удалять те AttributeReference, которых нет в определении блока.

Алгоритм работы следующий:
1. На основе определения блока получаем все его вхождения блоков.
2. Для каждого AttributeDefinition в определении блока проверяю наличие соответствующего ему AttributeReference (в каждом его вхождении блока).
2.1. Если параметр setAttDefValues равен true - перезаписываем значения всех AttributeReference
2.2. Если параметр removeSuperfluous равен true - удаляем все те AttributeReference, для которых отсутствует AttributeDefinition в определении блока.

имхо.

п.с. Если у кого есть предложения по расширению обозначенного мною выше функционала - я с интересом выслушаю их. Более того - я сам напишу этот метод и выложу его код.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 05.10.2011 в 17:12.
hwd вне форума  
 
Непрочитано 05.10.2011, 17:09
#10
Сергей Богатов


 
Регистрация: 21.02.2009
Сообщений: 825


Цитата:
Сообщение от hwd Посмотреть сообщение
Плохое решение.

Другой вариант решения:
Написать метод расширения static void AttSync(this BlockTableRecord btr, bool setAttDefValues, bool removeSuperfluous). Второй параметр указывает на то, следует ли во вхождениях блока перезаписать текущие значения AttributeReference на значения по умолчанию. Третий - следует ли удалять те AttributeReference, которых нет в определении блока.
Согласен. Просто так проще Сейчас переписываю код из VBA в VB.NET. Буду приводить в порядок Да и обработку динамических блоков надо будет добавлять...
__________________
Я-проектировщик бывший проектировщик!
Сергей Богатов вне форума  
 
Непрочитано 05.10.2011, 17:16
#11
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Сергей Богатов Посмотреть сообщение
Согласен. Просто так проще
Использовать SendCommand нужно с большой осторожностью, иначе это может вылезти боком. По возможности его вообще нужно избегать и прибегать к его помощи только тогда, когда не найдёшь альтернативы.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 05.10.2011, 17:24
#12
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Цитата:
Сообщение от Сергей Богатов Посмотреть сообщение
А чем не устроила подшивка?
У нас листами никто не пользуется. И не собирается. Есть готовые проекты (файлы dwg с чертежами в модели), которые берутся за основу для новых проектов.
Я одно время делал подшивки для новых проектов. А сейчас мне надоело.
Сделаю "свое колесо" а-ля "подшивка". Может получится и приживется.
Наверно можно было делать поверх подшивки, но мне показалось, что легче сделать "по-простому".
Vildar вне форума  
 
Непрочитано 05.10.2011, 17:36
#13
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Vildar Посмотреть сообщение
У нас листами никто не пользуется. И не собирается. Есть готовые проекты (файлы dwg с чертежами в модели), которые берутся за основу для новых проектов.
Я одно время делал подшивки для новых проектов. А сейчас мне надоело.
Сделаю "свое колесо" а-ля "подшивка". Может получится и приживется.
Наверно можно было делать поверх подшивки, но мне показалось, что легче сделать "по-простому".
Имхо - в данной ситуации лучше не изобретать велосипед, а использовать родные подшивки, без всяких там "аля". Это удобный, а главное - "родной" инструмент AutoCAD. Не знаю, что там может надоесть, причём настолько, чтобы начать лепить свой велосипед...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 05.10.2011, 18:49
#14
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,843


Цитата:
Сообщение от hwd Посмотреть сообщение
Более того - я сам напишу этот метод и выложу его код.
А сколько у тебя их готовых, просто если есть не "узкоспециализировавнные", может завернешь в LispFunction и выложешь под основные версии (типа HwdPowerPack.dll)
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 05.10.2011, 18:55
#15
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от hwd Посмотреть сообщение
Алгоритм работы следующий:
1. На основе определения блока получаем все его вхождения блоков.
2. Для каждого AttributeDefinition в определении блока проверяю наличие соответствующего ему AttributeReference (в каждом его вхождении блока).
2.1. Если параметр setAttDefValues равен true - перезаписываем значения всех AttributeReference
2.2. Если параметр removeSuperfluous равен true - удаляем все те AttributeReference, для которых отсутствует AttributeDefinition в определении блока.
имхо.
п.с. Если у кого есть предложения по расширению обозначенного мною выше функционала - я с интересом выслушаю их. Более того - я сам напишу этот метод и выложу его код.
hwd, Раз уж в теме речь идет о динамических блоках, то может расширить предложенный Вами функционал возможностью переноса значений соответсвующих динамических параметров.
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 05.10.2011, 19:14
#16
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
А сколько у тебя их готовых, просто если есть не "узкоспециализировавнные", может завернешь в LispFunction и выложешь под основные версии (типа HwdPowerPack.dll)
Есть кое-что. Часть из этого я уже "завернул" в библиотеку AcadNetLib.dll. Сейчас как раз дорабатываю документацию к ней - это черновик, сгенерированный на основе существующего кода. Я сейчас вношу изменения в комментарии исходников, чтобы справка генерировалась более полно: с примерами, пояснениями и т.п.

Писать lisp-функции на .net я пока не планирую, т.к. во первых - мне это не интересно (я на лиспе не пишу, а значит мне это не понадобится), а во вторых - работы полно.

Цитата:
Сообщение от TararykovDG
hwd, Раз уж в теме речь идет о динамических блоках, то может расширить предложенный Вами функционал возможностью переноса значений соответсвующих динамических параметров.
Честно говоря, я не понял того, что вы написали...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 05.10.2011, 19:33
#17
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Цитата:
Сообщение от hwd Посмотреть сообщение
Имхо - в данной ситуации лучше не изобретать велосипед, а использовать родные подшивки, без всяких там "аля". Это удобный, а главное - "родной" инструмент AutoCAD.
Согласен. Я сделал все что мог, чтобы внедрить подшивку. Не получилось. Люди ее не используют, ни в какую.
Цитата:
Сообщение от hwd Посмотреть сообщение
Не знаю, что там может надоесть, причём настолько, чтобы начать лепить свой велосипед...
Создавать листы, добавлять их в подшивку, именовать листы, нумеровать, вставлять ссылки на номера листов в примечания, печатать. Какой смысл мне продолжать все это делать одному.
А автоматизация мне интересна, я лучше ей позанимаюсь.

Цитата:
Сообщение от hwd Посмотреть сообщение
п.с. Если у кого есть предложения по расширению обозначенного мною выше функционала - я с интересом выслушаю их.
Как я понял, нужно обновлять три вещи у вхождений блока: геометрию, атрибуты, дин.параметры.
Но если получится обновить геометрию и атрибуты без создания нового вхождения блока (замены вхожд.блока), тогда думаю дин.параметры можно не проверять. И учесть, что при выполнении BlockReference.ResetBlock(), который может помочь при обновлении геометрии блока, сбрасывает дин.параметры в начальное положение.
Геометрию нужно обновлять, т.к. при копировании определения блока из другого чертежа с помощью WblockCloneObjects, геометрия вхождений этого бока не обновляется (тоже самое с атрибутами, и с дин.параметрами(не уверен)).

Последний раз редактировалось Vildar, 05.10.2011 в 19:47.
Vildar вне форума  
 
Непрочитано 05.10.2011, 19:52
#18
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от hwd Посмотреть сообщение
Честно говоря, я не понял того, что вы написали...
Был блок A c атрибутами A1 (знач. по умолчанию "xxx"), A2 (знач. по умолчанию "yyy") и дин. параметром D1 (знач. по умолчанию 50, пусть это лин. параметр расстояние). На чертеже имелось 2 вхождения блока A. В первом вхождении A1 имел значение "Вася", A2 - "Петя", дин.параметр D1 был равен 100, во втором вхождении A1 - "Оля", A2 - "Катя", D1 = 200. Обновляем блок. Теперь у нас в описании блока A один атрибут A1 и один дин. параметр D1, A2 нет. После применения некого метода static void AttSync(this BlockTableRecord btr, bool setAttDefValues, bool removeSuperfluous, bool setDynParamValue) обновляем вхождения и кроме значений атрибута A1 в первом вхождении D1 остается равен 100, а во втором 200
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 05.10.2011, 20:03
#19
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
Был блок A c атрибутами A1 (знач. по умолчанию "xxx"), A2 (знач. по умолчанию "yyy") и дин. параметром D1 (знач. по умолчанию 50, пусть это лин. параметр расстояние). На чертеже имелось 2 вхождения блока A. В первом вхождении A1 имел значение "Вася", A2 - "Петя", дин.параметр D1 был равен 100, во втором вхождении A1 - "Оля", A2 - "Катя", D1 = 200. Обновляем блок. Теперь у нас в описании блока A один атрибут A1 и один дин. параметр D1, A2 нет. После применения некого метода static void AttSync(this BlockTableRecord btr, bool setAttDefValues, bool removeSuperfluous, bool setDynParamValue) обновляем вхождения и кроме значений атрибута A1 в первом вхождении D1 остается равен 100, а во втором 200
теперь понял, только на мой взгляд именно так и имеет смысл делать, а не сбивать 100 и 200 обратно в 50 (т.е. тут вариант только один). Или я ошибаюсь?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 05.10.2011, 20:24
#20
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от hwd Посмотреть сообщение
теперь понял, только на мой взгляд именно так и имеет смысл делать, а не сбивать 100 и 200 обратно в 50 (т.е. тут вариант только один). Или я ошибаюсь?
Наверное Вы правы, но раз уж есть bool setAttDefValues и можно сбрасывать атрибуты в умолчательные значения, то почему бы не быть и bool setDynParamValue, а там как надо с такими значениями и вызывать static void AttSync
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 05.10.2011, 20:37
#21
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
Наверное Вы правы, но раз уж есть bool setAttDefValues и можно сбрасывать атрибуты в умолчательные значения, то почему бы не быть и bool setDynParamValue, а там как надо с такими значениями и вызывать static void AttSync
Ок, пусть будет static void AttSync(this BlockTableRecord btr, bool removeSuperfluous, bool setAttDefValues, bool setDynDefValues).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 09.10.2011, 13:01
#22
bargool


 
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 501
<phrase 1=


Я сейчас поплотнее посмотрел, BlockTableRecord имеет метод UpdateAnonymousBlocks, который обновляет динамические свойства вхождений блоков
Этот код обновляет динамические свойства вхождений после изменения описания блока. Атрибуты не обновляются.
Код:
[Выделить все]
BlockTableRecord frame = transaction.GetObject(
	blockTable[blockname], OpenMode.ForRead) as BlockTableRecord;
if (frame != null)
{
	frame.UpdateAnonymousBlocks();
}
осталось только атрибуты обновлять.

Последний раз редактировалось bargool, 09.10.2011 в 13:05. Причина: нечаянно отправил сообщение
bargool вне форума  
 
Непрочитано 09.10.2011, 13:30
#23
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от bargool Посмотреть сообщение
Я сейчас поплотнее посмотрел, BlockTableRecord имеет метод UpdateAnonymousBlocks, который обновляет динамические свойства вхождений блоков
Этот код обновляет динамические свойства вхождений после изменения описания блока. Атрибуты не обновляются.
Код:
[Выделить все]
BlockTableRecord frame = transaction.GetObject(
	blockTable[blockname], OpenMode.ForRead) as BlockTableRecord;
if (frame != null)
{
	frame.UpdateAnonymousBlocks();
}
осталось только атрибуты обновлять.
я в курсе об этом методе
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 09.10.2011, 20:18
#24
bargool


 
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 501
<phrase 1=


static void AttSync(this BlockTableRecord btr, bool removeSuperfluous, bool setAttDefValues, bool setDynDefValues), мне кажется, не надо делать настолько универсальный метод , обычный аналог attsynca, и всё

Последний раз редактировалось bargool, 09.10.2011 в 20:49.
bargool вне форума  
 
Непрочитано 09.10.2011, 21:51 Моя реализация метода AttSynch
1 | #25
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от bargool Посмотреть сообщение
static void AttSync(this BlockTableRecord btr, bool removeSuperfluous, bool setAttDefValues, bool setDynDefValues), мне кажется, не надо делать настолько универсальный метод , обычный аналог attsynca, и всё
Я написал реализацию метода (последний параметр всё же убрал из сигнатуры). Реальная сигнатура такова:

static void AttSync(this BlockTableRecord btr, bool removeSuperfluous, bool setAttDefValues)

Код выложил здесь. Протестировал - работает как на обычных, так и на динамических блоках (тестировал в AutoCAD 2009).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 09.10.2011, 22:28
#26
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от hwd Посмотреть сообщение
Я написал реализацию метода (последний параметр всё же убрал из сигнатуры). Реальная сигнатура такова:

static void AttSync(this BlockTableRecord btr, bool removeSuperfluous, bool setAttDefValues)

Код выложил здесь. Протестировал - работает как на обычных, так и на динамических блоках (тестировал в AutoCAD 2009).


hwd, спасибо за код . И все-таки в коде по ссылке сигнатура шире чем была изначально static void AttSync(this BlockTableRecord btr, bool directOnly, bool removeSuperfluous, bool setAttDefValues)
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 09.10.2011, 22:30
#27
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
hwd, спасибо за код . И все-таки в коде по ссылке сигнатура шире чем была изначально static void AttSync(this BlockTableRecord btr, bool directOnly, bool removeSuperfluous, bool setAttDefValues)
А, ну да, забыл упомянуть... С помощью этого параметра я даю возможность управлять тем, стоит ли обрабатывать те вхождения блоков, которые входят в состав др. определения блока. Т.е. блок в блоке. Иными словами - параметр указывает, нужна ли рекурсивная проверка содержимого блоков.

п.с. Подправил код - добавил контроль над многими дополнительными свойствами атрибута (цвет/слой/ширина/и т.п.). В процессе тестирования обнаружил такой баг (я видимо где-то накосячил в коде): у меня в некоторых вхождениях блоков, один атрибут почему-то разместился в точке 0,0 (МСК) вместо того, чтобы находиться там, где положено. Разбираюсь с проблемой.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 10.10.2011 в 08:51.
hwd вне форума  
 
Автор темы   Непрочитано 10.10.2011, 10:17
#28
bargool


 
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 501
<phrase 1=


hwd, у меня вопрос: ты обращаешься к свойству атрибута TextStyle, это в 2009 есть? просто в 2010 есть только TextStyleId и TextStyleName
bargool вне форума  
 
Непрочитано 10.10.2011, 11:10
#29
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от bargool Посмотреть сообщение
hwd, у меня вопрос: ты обращаешься к свойству атрибута TextStyle, это в 2009 есть? просто в 2010 есть только TextStyleId и TextStyleName
Не сложно догадаться, что если бы такого свойства не было, то я бы попросту не смог скомпилировать код.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 10.10.2011, 11:57
#30
4ydik

Инженер
 
Регистрация: 08.10.2009
Красноярск
Сообщений: 16


Цитата:
Сообщение от hwd Посмотреть сообщение
Я написал реализацию метода (последний параметр всё же убрал из сигнатуры). Реальная сигнатура такова:

static void AttSync(this BlockTableRecord btr, bool removeSuperfluous, bool setAttDefValues)

Код выложил здесь. Протестировал - работает как на обычных, так и на динамических блоках (тестировал в AutoCAD 2009).
Извините меня. я в этом чайник, как этот код прикрутить к Autocad? И как его заставит работать?
4ydik вне форума  
 
Автор темы   Непрочитано 10.10.2011, 12:31
#31
bargool


 
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 501
<phrase 1=


Цитата:
Сообщение от 4ydik Посмотреть сообщение
Извините меня. я в этом чайник, как этот код прикрутить к Autocad? И как его заставит работать?
конкретно этот код нужен для использования в других дотнетовских программах. Сам по себе он дублирует стандартную команду автокада attsync. Вам точно нужно объяснять как с ним работать?
bargool вне форума  
 
Непрочитано 10.10.2011, 12:40
#32
4ydik

Инженер
 
Регистрация: 08.10.2009
Красноярск
Сообщений: 16


Цитата:
Сообщение от bargool Посмотреть сообщение
конкретно этот код нужен для использования в других дотнетовских программах. Сам по себе он дублирует стандартную команду автокада attsync. Вам точно нужно объяснять как с ним работать?
У меня имеется куча динам. блоков во внешних файлах которые периодически надо обновлять в соответствии с исходником! Вот я подумал что эта программа спасет меня от того чтобы тыкать по палитре свойств и обновлять каждый блок отдельно!
4ydik вне форума  
 
Автор темы   Непрочитано 10.10.2011, 12:46
#33
bargool


 
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 501
<phrase 1=


Цитата:
Сообщение от 4ydik Посмотреть сообщение
У меня имеется куча динам. блоков во внешних файлах которые периодически надо обновлять в соответствии с исходником! Вот я подумал что эта программа спасет меня от того чтобы тыкать по палитре свойств и обновлять каждый блок отдельно!
Это промежуточный результат. Я, сейчас как раз такую программку пишу (почему и создал топик). Предполагаю спрашивать пользователя, какой блок обновлять (ткнуть в примитив), затем спросить файл с эталонным блоком, затем спросить в каких ещё файлах обновлять блоки (это полезно если рамка, к примеру, обновилась..). Но пока я ещё в процессе. Код hwd, очень помог.
Какой у вас автокад?

Последний раз редактировалось bargool, 10.10.2011 в 13:46.
bargool вне форума  
 
Непрочитано 10.10.2011, 14:48
#34
4ydik

Инженер
 
Регистрация: 08.10.2009
Красноярск
Сообщений: 16


У меня 2012 64 bit!
4ydik вне форума  
 
Непрочитано 10.10.2011, 14:55
#35
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от 4ydik Посмотреть сообщение
У меня 2012 64 bit!
и что? я писал и тестил attsync как под 86, так и под 64. Небольшую разницу в API для версии 2012 те, кто пишет на .net, сами внесут.

п.п.с всё, код можно тестировать далее - все обнаруженные баги исправлены. В исходном коде я закомментировал проблемные строки и указал, какие именно проблемы они вызывали:
Цитата:
строки 90, 94 128 и 132 Сбивали позиционирование атрибута GGG
Строки 100 и 138 Вызывали обрушение AutoCAD при нажатии Ctrl + Z
p.s.2 Внёс изменение в код - реализовал корректное выравнивание атрибута.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 11.10.2011 в 11:56.
hwd вне форума  
 
Непрочитано 18.10.2011, 16:03
#36
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Для тех, кому тема интересна: обновил версию BlockSync + выложил исходники. Более подробно здесь.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > C# .net переопределение динамического блока из внешнего файла

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна функция импорта блока из файла Krieger Программирование 20 18.01.2017 07:19
Странное поведение динамического блока высотной отметки hwd Динамические блоки 12 08.09.2011 11:15
Повторное создание вхождения блока из внешнего файла hwd AutoCAD 6 02.04.2010 16:16
Как перенести в чертеж блок из файла библиотеки блоков Main Urod Программирование 8 03.02.2010 14:15
Обновление/замена блока с таким же именем из другого файла. Pesec AutoCAD 2 11.11.2009 19:33