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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Проблемы с перемещением штриховки. Civil 3D, C#

Проблемы с перемещением штриховки. Civil 3D, C#

Ответ
Поиск в этой теме
Непрочитано 15.02.2013, 14:38 #1
Проблемы с перемещением штриховки. Civil 3D, C#
TAPRAA
 
до-диез
 
Томск
Регистрация: 15.02.2013
Сообщений: 20

Итак, у нас есть чертеж с двумя штриховками (объекты Hatch). После преобразования координат (параллельного переноса, в частности) один из объектов помещается на то место, на которое и должен. Второй же объект начинает вести себя странно: штриховка остается на том же месте, на котором и была, при выделении всего (Ctrl+A) контур штриховки находится на положенном месте (после преобразования), но при отмене (ESC), на это месте ничего нет. При незначительном перемещении мышкой штриховки на старом месте, она сразу встает на новое, которое после преобразования. При выделении этой же штриховки и просмотра полей/свойств в дебаге, вижу, что координаты корректно изменились и она должна находится на новом месте.

Собственно, вопрос: как сделать так, чтобы эта штриховка сразу вставала на свое положенное место?
Просмотров: 5167
 
Непрочитано 15.02.2013, 16:06
#2
bargool


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


Перемещение делаете в созданном документе, или new database?
Буквально вчера бился с чем-то похожим, даже создал тему (возможно понадобится регистрация)
__________________
Алексей

Последний раз редактировалось bargool, 18.02.2013 в 11:14.
bargool вне форума  
 
Непрочитано 15.02.2013, 16:08
#3
Boxa

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


Может в конце кода вызывать acDoc.SendStringToExecute("_regenall ", True, False, False) ?
Boxa на форуме  
 
Непрочитано 15.02.2013, 16:10
#4
bargool


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


В моем случае не помогало Помогало только ручками зайти в редактор блоков, сохранить блок и выйти.
Даже видео записал
Increase Size Decrease Size Database.Insert() and Hatch in Dynamic Block
http://www.youtube.com/watch?v=3zcjUGdVNiM
__________________
Алексей
bargool вне форума  
 
Автор темы   Непрочитано 18.02.2013, 06:37
#5
TAPRAA

до-диез
 
Регистрация: 15.02.2013
Томск
Сообщений: 20
<phrase 1= Отправить сообщение для TAPRAA с помощью Skype™


Цитата:
Сообщение от Boxa Посмотреть сообщение
Может в конце кода вызывать acDoc.SendStringToExecute("_regenall ", True, False, False) ?
В моем случае, это тоже не прокатило)


Цитата:
Сообщение от bargool Посмотреть сообщение
Помогало только ручками зайти в редактор блоков, сохранить блок и выйти.
Ручками зайти и поправить тоже не вариант, ибо таких объектов может быть очень много.

И все же, почему одна штриховка преобразуется нормально, а вторая нет? Это все баги автокада или я что-то делаю не так?)

P.S. Перемещение делаю в заранее созданном документе.

Последний раз редактировалось TAPRAA, 18.02.2013 в 08:33.
TAPRAA вне форума  
 
Непрочитано 18.02.2013, 11:12
#6
Do$

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


Если выложишь пример чертежа и код, можно будет поковыряться, посмотреть. А также, версию Civil неплохо бы узнать...
Do$ вне форума  
 
Автор темы   Непрочитано 18.02.2013, 12:32
#7
TAPRAA

до-диез
 
Регистрация: 15.02.2013
Томск
Сообщений: 20
<phrase 1= Отправить сообщение для TAPRAA с помощью Skype™


Используется AutoCAD Civil 3D 2012.

Принцип примерно такой

Код:
[Выделить все]
 var document = Application.DocumentManager.MdiActiveDocument;
var database = document.Database;

using(document.LockDocument())
{
	using (var trans = database.TransactionManager.StartTransaction())
	{
		var updateStorage = new List<UpdateStorage>();
		
		// Код для заполнения коллекции. Здесь и происходит преобразование.
		updateStorage.Fill();
		
		foreach (var element in updateStorage)
		{
			using (var ent = (Entity)trans.GetObject(element.ObjectId, OpenMode.ForWrite, true, true))
			{
				var hatch = ent as Hatch;
				if (hatch == null)
					continue;
					
				//  Удаляем все предыдущие петли
				while (hatch.NumberOfLoops != 0)
					hatch.RemoveLoopAt(0);
					
				foreach(var loop in element.Loops)
				{
					var hatchLoop = GetHatchLoop(loop.Segments);
					if (hatchLoop.Polyline.Count == 0)
						continue;
					
					hatch.AppendLoop(hatchLoop);
				}
				
				// Устанавливаем нормальное отображение штриховки.
				hatch.HatchStyle = HatchStyle.Normal;
			}
		}
		
		trans.Commit();
	}
}
Где:
Код:
[Выделить все]
 private struct UpdateStorage
{
     // Измененный объект.
     internal BaseEntity BaseEnt;

     // Идентификатор существующего объекта.
     internal ObjectId ObjectId;
}
И:
Код:
[Выделить все]
 private static HatchLoop GetHatchLoop(Segment[] segments)
{
     var hatchLoop = new HatchLoop(HatchLoopTypes.Polyline);
     var index = 0;
     foreach (var segment in segments)
     {
          index++;
          if (segment is SegmentLine)
          {
               var segmentLine = (SegmentLine)segment;
               var startPoint = new Point2d(segmentLine.StartPoint.X, segmentLine.StartPoint.Y);
               var endPoint = new Point2d(segmentLine.EndPoint.X, segmentLine.EndPoint.Y);
               hatchLoop.Polyline.Add(new BulgeVertex(startPoint, 0));
               if (index == segments.Length)
               {
                    var vertex = new BulgeVertex(endPoint, 0);
                    hatchLoop.Polyline.Add(vertex);
               }
          }
          else if (segment is SegmentArc)
          {
               var segmentArc = (SegmentArc)segment;
               var vertex = new BulgeVertex(NewPoint2d(segmentArc.StartPoint), segmentArc.Bulge);
               hatchLoop.Polyline.Add(vertex);
               if (index == segments.Length)
               {
                    vertex = new BulgeVertex(NewPoint2d(segmentArc.EndPoint), 0);
                    hatchLoop.Polyline.Add(vertex);
               }
           }
           else
          {
               throw new NotImplementedException();
          }
     }

     return hatchLoop;
}
И сам чертеж. Нижний полукруг преобразуется нормально, у стрелки переносится только контур, а штриховка остается.
Вложения
Тип файла: dwg
DWG 2010
Drawing.dwg (360.8 Кб, 1890 просмотров)

Последний раз редактировалось TAPRAA, 19.02.2013 в 05:56. Причина: Обертка кода дополнительными тегами для удобства.
TAPRAA вне форума  
 
Непрочитано 18.02.2013, 22:03
#8
Do$

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


"Сивильного" в коде вроде ничего нет...
Попробовал запустить, ругается на: updateStorage.Fill, element.Loops, BaseEntity, Segment, SegmentArc, SegmentLine и NewPoint2d. Я не шибко большой специалист по экзотическим нэймспейсам, но сдается мне, что это что-то собственного изобретения...
Do$ вне форума  
 
Непрочитано 18.02.2013, 23:22
1 | #9
bargool


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


Пальцем в небо, т.к. тут только маааленький отрывок кода. hatch.EvaluateHatch(true) после hatch.HatchStyle = HatchStyle.Normal не поможет?
И для удобства чтения оборачивайте, пожалуйста, код C# тегами [ CODE][ CPP][ /CPP][ /CODE], тогда будет подсветка синтаксиса и прочие удобства (кнопка через одну от использованной кнопки "Код")
__________________
Алексей
bargool вне форума  
 
Автор темы   Непрочитано 19.02.2013, 07:06
#10
TAPRAA

до-диез
 
Регистрация: 15.02.2013
Томск
Сообщений: 20
<phrase 1= Отправить сообщение для TAPRAA с помощью Skype™


Цитата:
Сообщение от Do$ Посмотреть сообщение
"Сивильного" в коде вроде ничего нет...
Попробовал запустить, ругается на: updateStorage.Fill, element.Loops, BaseEntity, Segment, SegmentArc, SegmentLine и NewPoint2d. Я не шибко большой специалист по экзотическим нэймспейсам, но сдается мне, что это что-то собственного изобретения...
К сожалению, я не могу выложить полный код, поэтому написал, что принцип примерно такой

Цитата:
Сообщение от bargool Посмотреть сообщение
hatch.EvaluateHatch(true) после hatch.HatchStyle = HatchStyle.Normal не поможет?
Это помогло, спасибо Но я рано порадовался, после этой инструкции мой модуль вместе с автокадом наглухо повис на
Код:
[Выделить все]
 Autodesk.AutoCAD.Internal.Utils.ZoomAuto(1, 0, 0, 0, 0);
TAPRAA вне форума  
 
Непрочитано 19.02.2013, 09:36
#11
Do$

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



Цитата:
Сообщение от TAPRAA Посмотреть сообщение
К сожалению, я не могу выложить полный код
Цитата:
Сообщение от bargool Посмотреть сообщение
Пальцем в небо, т.к. тут только маааленький отрывок кода.
Вот вам рука, подскажите, почему у меня болит голова...
Может и угадаете, конечно...
ИМХО - хочешь, чтобы тебе помогли, предоставь достаточно для этого данных. Мне не надо весь код, мне нужно только в том объеме, чтобы воспроизвести у себя проблему.
Do$ вне форума  
 
Непрочитано 19.02.2013, 10:50
1 | #12
bargool


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


Цитата:
Сообщение от Do$ Посмотреть сообщение
ИМХО - хочешь, чтобы тебе помогли, предоставь достаточно для этого данных. Мне не надо весь код, мне нужно только в том объеме, чтобы воспроизвести у себя проблему
Автор выложил в данном случае достаточно кода, что бы предположить проблему. А то, что не компилируется - значит пусть сам проверяет предположения
Цитата:
Сообщение от TAPRAA Посмотреть сообщение
Autodesk.AutoCAD.Internal.Utils.ZoomAuto(1, 0, 0, 0, 0);
это для ZoomExtents? Может, пользоваться управляемым кодом? Автодеск даёт работающий пример для Zoom. См. Display Drawing Extents and Limits, там используется чудный метод Zoom отсюда
__________________
Алексей
bargool вне форума  
 
Автор темы   Непрочитано 19.02.2013, 11:47
#13
TAPRAA

до-диез
 
Регистрация: 15.02.2013
Томск
Сообщений: 20
<phrase 1= Отправить сообщение для TAPRAA с помощью Skype™


Примеры с сайта автодеска дают немного не тот результат, который необходим, да и ладно
Косяк с зумом - ничто, по сравнению со штриховками. Думаю, для пользователей не будет проблемой нажать 2 раза среднюю кнопку мыши.

Спасибо всем за то, что откликнулись
TAPRAA вне форума  
 
Непрочитано 21.02.2013, 17:03
#14
Олег (jr.)

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


Цитата:
Сообщение от TAPRAA Посмотреть сообщение
Нижний полукруг преобразуется нормально, у стрелки переносится только контур, а штриховка остается.
Выставь LUPREC=8 и проверь координаты линий
они у тебя не бьют в сотых
Можно также использовать мощный метод acedCmd,
быстрый пример:
Код:
[Выделить все]
       // use "AccoreConsole.exe" instead of "acad.exe" included in Autocad 2013
        [System.Security.SuppressUnmanagedCodeSecurity]
        [DllImport("acad.exe", EntryPoint = "acedCmd", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
        extern static private int acedCmd(IntPtr resbuf);


           	[CommandMethod("PeditLines","pel", CommandFlags.UsePickSet)]
	public void LinesToPoly()
	{
        Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("PEDITACCEPT", 1);
		// get the autocad editor instance
		Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
		// get a select set of entities in the dwg window
		PromptSelectionResult selection = ed.GetSelection();
		// if the selection was successful
		if (selection.Status == PromptStatus.OK) {
			// create a new .NET resbuf struct
			ResultBuffer rb = new ResultBuffer();
			// create the buildlist
			rb.Add(new TypedValue(5005, "_PEDIT"));
            rb.Add(new TypedValue(5005, "_M"));
			// RTSTR
            foreach (ObjectId id in selection.Value.GetObjectIds())
            {
				rb.Add(new TypedValue(5006, id));
				// RTENAME
			}
            rb.Add(new TypedValue(5005, ""));
            rb.Add(new TypedValue(5005, "_J"));
			// exit out of entity selection
			rb.Add(new TypedValue(5005, ""));
			// RTSTR
			rb.Add(new TypedValue(5005, ""));
			// RTSTR
			// now call the zoom to objects command
			acedCmd(rb.UnmanagedObject);
            ed.UpdateScreen();
            rb = new ResultBuffer();
            ObjectId lstId = ed.SelectLast().Value.GetObjectIds()[0];
            rb.Add(new TypedValue(5005, "_ZOOM"));
            rb.Add(new TypedValue(5005, "_OB"));
            rb.Add(new TypedValue(5006, lstId));
            rb.Add(new TypedValue(5005, ""));
            acedCmd(rb.UnmanagedObject);

            rb = new ResultBuffer();
            rb.Add(new TypedValue(5005, "_-HATCH"));
            rb.Add(new TypedValue(5005, "_P"));
            rb.Add(new TypedValue(5005, "SOLID"));
            rb.Add(new TypedValue(5005, "_S"));
            rb.Add(new TypedValue(5006, lstId));
            rb.Add(new TypedValue(5005, ""));
            rb.Add(new TypedValue(5005, ""));
            acedCmd(rb.UnmanagedObject);
            ed.UpdateScreen();
		}
	}

Последний раз редактировалось Олег (jr.), 21.02.2013 в 18:51. Причина: добавлен пример кода
Олег (jr.) вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Проблемы с перемещением штриховки. Civil 3D, C#

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание поверности и 3d модели поверхности в AutoCAD Civil 3d 2009 Arhistratig Вертикальные решения на базе AutoCAD 25 07.05.2013 14:53
Civil 3D: кто как решает вопросы геологии и водопропускных труб? AlexYoung Вертикальные решения на базе AutoCAD 3 01.06.2010 17:48
Новый AutoCAD Civil 3D 2010 Ygorekk Вертикальные решения на базе AutoCAD 21 03.04.2010 21:51
Revit Architecture 2008: Тормоза при работе с 3D моделью, плюс проблемы с тонированием lara Revit 13 09.09.2009 10:05
Создание линии пересечения поверхностей в Civil 3D 2007 miner Вертикальные решения на базе AutoCAD 12 26.03.2009 14:02