Новый ZWCAD 2017
dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > .Net C# Существует ли "область видимости" у объектов AutoCada?

.Net C# Существует ли "область видимости" у объектов AutoCada?

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 10.12.2014, 16:16 #1
.Net C# Существует ли "область видимости" у объектов AutoCada?
ursus
 
Регистрация: 03.10.2014
Сообщений: 6

ursus вне форума Вставить имя

Приветствую!

По заданию мне необходимо получить выделение примитивов для дальнейших манипуляций.
Архитектура моего недоплагина такова:
есть класс который обеспечивает базовые Акадовские функции как то: получение примитива, точки, блока, слоя и т.д и т.п. Есть форма, в которой мне вздумывается вызывать эти самые базовые функции.

В данный момент столкнулся с проблемой - в одной из функций класса формы я объявляю списки типа Entity и ObjectId (в частности для получения списка блоков). В классе формы у меня нет механизма транзакций т.к. весь этот механизм реализован обслуживающим классом. т.е. в форме я получаю конкретные объекты или контейнеры объектов.

Код:
[Выделить все]
foreach (Entity room in lstRooms)
					{
						foreach (BlockReference block in lstEmeoBlocks)
						{
							if (_acad.IsPointInsidePrimitive(room, block.Position))
							{
								drBlock[0] = "помещение" + room.Handle.ToString();								
								drBlock[1] = "наименование блока" + block.BlockName;
								drBlock[2] = "handle" + block.Handle;
А теперь проблема: когда идет обращение к room.Handle (а так же block.handle) акад выпадает в осадок быстро и бесповоротно. блоки try catch не спасают. Ругается на то, что объект недоступен.

Т.е. получается что можно обращаться к полям таким как handle, blockname и другим только в контексте транзакций?
Просмотров: 1850
 
Непрочитано 10.12.2014, 17:14
#2
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,619
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от ursus Посмотреть сообщение
Т.е. получается что можно обращаться к полям таким как handle, blockname и другим только в контексте транзакций?
Да, именно так.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 10.12.2014, 17:19
#3
ursus


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


Спасибо. Пойду лепить обёртки. Вот вроде и хочется сделать норм архитектуру, авотфиг. Код пухнет как на дрожжах.
ursus вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 10.12.2014, 17:26
#4
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,619
Отправить сообщение для Do$ с помощью Skype™


Ну если хочется досконально разобраться в вопросе - то самый лучший мануал находится здесь: http://bushman-andrey.blogspot.ru/se...oseTransaction
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 11.12.2014, 10:32
#5
ursus


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


Благодарю. буду разбираться. Отступать некуда.

----- добавлено через ~1 ч. -----
Не могу понять другое. Есть участок кода: получает из сервисного класса объект Entity, выводит handle в текстбокс.

Код:
[Выделить все]
private void btnTakeExistPrimitive_Click(object sender, EventArgs e)
        {
            try
            {                
                Entity choosenPrimitive = _acad.GetEntityForRead;
                txbObjectHandle.Text = choosenPrimitive.Handle.ToString();
Работает без ошибок; сервисный класс реализует это при помощи следующего кода:
Код:
[Выделить все]
PromptEntityResult entRes = ed.GetEntity("Укажите примитив.");						
Entity obj = (Entity)tr.GetObject(entRes.ObjectId, OpenMode.ForRead);
Почему в таком случае не работает вот этот код?
Код:
[Выделить все]
foreach (Entity room in lstRooms)
{
      List<Entity> lstRooms = _acad.GetEntitesFromSelection();
      List<ObjectId> lstEmeoBlockIds = _acad.GetObjectIdListFromSelection();
      List<BlockReference> lstEmeoBlocks = _acad.GetBlockReferenceList(lstEmeoBlockIds);

      foreach (BlockReference block in lstEmeoBlocks)
     {
	if (_acad.IsPointInsidePrimitive(room, block.Position))
	{
                 // drBlock = DataRow; Пробовал выводить просто в текстбокс - таже проблема. 
		drBlock[0] = "помещение" + room.Handle.ToString();								
		drBlock[1] = "наименование блока" + block.BlockName;
	        drBlock[2] = "handle" + block.Handle;
ругается в первую очередь на то, что недоступен объект из списка Entity. Не может считать room.Handle.

Объекты Entity получаю из сервисного класса через выделение. Основной код такой:

Код:
[Выделить все]
PromptSelectionOptions pso = new PromptSelectionOptions();
					pso.MessageForAdding = "Выберите примитивы";
					pso.SingleOnly = false;
					pso.SinglePickInSpace = false;
					pso.AllowDuplicates = false;
					pso.AllowSubSelections = false;

					List<ObjectId> objectIds = null;

					PromptSelectionResult psr = ed.GetSelection(pso);
					
					if (psr.Status == PromptStatus.OK)
					{
						objectIds = psr.Value.GetObjectIds().ToList();						
					}
					else
					{
						throw new System.Exception("Ошибка селекции");
					}

					foreach (ObjectId ID in objectIds)
					{
						if (ID.IsValid)
						{
							var ent = tr.GetObject(ID, OpenMode.ForRead) as Entity;
							answerList.Add(ent);
						}
					}
Не пойму, по какой причине один участок кода (Считывание хэндла в текст бокс вне контекста транзакции) отрабатывает без проблем, а в другом случае похожий (на мой взгляд) код рушится. Особенность в том что (как я понял) падает сам АвтоКад, а не мой код. Если бы код - то срабатывали бы блоки Try-Catch. А так - Фатальная ошибка и всё.

----- добавлено через ~1 ч. -----
А не работает потому, что foreach. при обращении к списку через индекс lstRooms[0].handle вывел значение в текстбокс как положено.
ursus вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > .Net C# Существует ли "область видимости" у объектов AutoCada?

Инженерные консультации
Опции темы Поиск в этой теме
Поиск в этой теме:

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка ПОС, искусство проектирования Tyhig Технология и организация строительства 106 25.10.2015 19:00
Аттестация в Минрегионе по негосударственной экспертизе Людмила Охр Прочее. Архитектура и строительство 350 14.02.2015 17:50
Существует ли аналог (findfile) в .NET? Кулик Алексей aka kpblc .NET 16 13.08.2010 00:11
Создание и редактирование 3Д объектов с использованием .NET NR4TR .NET 29 24.02.2010 10:52
FILTER / фильтр BM60 Справочник команд 0 08.07.2008 15:35

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||


Размещение рекламы