На пользовательской палитре имеется некий перечень объектов (например, отображается handle, тип и лист, где размещен объект).
По двойному щелчку необходимо:
- установить текущий лист, где расположен объект.
- выбрать объект (т.е. объект должен быть подсвечен и иметь ручки выбора)
- выполнить zoom по объекту.
Проблема заключается в выборе объекта. Если объект расположен в листах, все работает хорошо. Но, если объект расположен в модели, получается следующая ситуация:
Если последний текущий layout - это лист (а не модель), то то после программной установки текущего layout (lm.CurrentLayout = LayoutName, т.е. "model"), объект выбирается, но на экране он не подсвечивается (отсутствует подсветка и ручки выбора). При этом, если вручную щелкнуть мышкой в области модели, то подсветка появляется.
Если я предварительно вручную устанавливаю правильный layout (в видео действия, после снятия флажка), то подсветка осуществляется корректно.
Видео прилагаю
Видимо, проблема похожа на описанную в
https://adn-cis.org/forum/index.php?topic=415.0, но у меня ситуация другая.
SetFocus (возможно нужен handle именно окна Windows, отображающего графическое окно, а не приложения/документа?), UpdateScreen не помогают.
Выбор объектов осуществляется функцией ed.SetImpliedSelection(idarr);
Ранее использовал с тем же результатом функцию Autodesk.AutoCAD.Internal.Utils.SelectObjects(idarr);
Пример тестового проекта и тестового dwg-файла (dwg-файл можно брать любой) прилагаю.
Тестовый проект создан с нуля именно для воспроизведения ситуации, в нем есть некие другие огрехи.
После загрузки SelectObj.dll и выполнения команды TestSelectObject программа по текущему чертежу считывает перечень объектов (функция filldata) и отображает его в виде таблицы на палитре.
Далее, по двойному щелчку отрабатывает:
- функция SetCurrentLayout (в режиме блокировки отрабатывается lm.CurrentLayout = LayoutName;)
- функция FindAndZoomObject (отрабатывает код ed.SetImpliedSelection(idarr))
Ниже привожу код функции SetCurrentLayout и часть строчек из функции FindAndZoomObject
public static void FindAndZoomObject(String Handle)
{
...
long ln = Convert.ToInt64(Handle, 16);
// Not create a Handle from the long integer
hn = new Handle(ln);
// And attempt to get an ObjectId for the Handle
id = db.GetObjectId(false, hn, 0);
....
// Здесь начинается выбор элемента на экране
ObjectId[] idarr = new ObjectId[1];
idarr[0] = id;
DocumentLock lockDoc = doc.LockDocument();
using (lockDoc)
{
// SetFocusToActiveDocument();
// Autodesk.AutoCAD.Internal.Utils.SelectObjects(idarr);
ed.SetImpliedSelection(idarr);
ed.UpdateScreen();
// SetFocusToActiveDocument();
}
}//func
public static Boolean SetCurrentLayout(String LayoutName)
{
LayoutManager lm = LayoutManager.Current;
if (String.Compare(lm.CurrentLayout, LayoutName, true) != 0)
{
try
{
DocumentLock lockDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument();
using (lockDoc)
{
lm.CurrentLayout = LayoutName;
}
}
catch (System.Exception ex1)
{
System.Windows.Forms.MessageBox.Show(String.Format("Ошибка установки Листа {0}. Текст ошибки {1}", LayoutName, ex1.Message));
return false;
}
}//if
return true;
}