Скрытие на опред время окна WPF в автокад

Автор Тема: Скрытие на опред время окна WPF в автокад  (Прочитано 8673 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн TeltroАвтор темы

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
есть wpf-окно, нужно его временно скрыть для выбора координаты с помощью GetPoint. Пробовал Hide() и Show(), но как понял, Hide() завершает работу с окном. Также, пробовал вариант

Код - C# [Выбрать]
  1. var window = Autodesk.AutoCAD.ApplicationServices.Application.DocumentWindowCollection.ActiveDocumentWindow;
  2. window.Visible = false;
  3. window.Visible = true;

и он работал(хз, должен ли был), но, что удивительно, ничего не изменив в методе обработки кнопки выбора координат, он перестал работать: скрывает саму вкладку чертежа

Есть ли другие варианты, ну или вообще: как это делается?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Teltro,
Еще раз напоминаю про правило форматирования кода на форуме!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Teltro 02-04-2019, 07:41:56

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Смотрите метод Editor.StartUserInteraction

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Пробовал Hide() и Show(), но как понял, Hide() завершает работу с окном
Ерунда. Методы Hide() и Show() просто меняют видимость окна (свойство Visibility). И это работает как кирпич - просто и безотказно

Оффлайн TeltroАвтор темы

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Пробовал Hide() и Show(), но как понял, Hide() завершает работу с окном
Ерунда. Методы Hide() и Show() просто меняют видимость окна (свойство Visibility). И это работает как кирпич - просто и безотказно
Хз, может что не так делаю, но перед тем как использовать GetPoint я скрывал окно с помощью Hide(), после показывал Show(), но в результате, при нажатии моих кнопок "ОК" и "Отмена" автокад ломался, но без скрытия - всё ок.
...Но тут же подумал, может это всё потому что в методе обработки "ОК" и "Отмена" было DialogResult = true и Close().

Извините за мою недоопытность здесь)

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Хз, может что не так делаю
100%. Но без кода - мы тут говорим ни о чем

Оффлайн TeltroАвтор темы

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Код(думаю XAML самого окна тут не нужен)

Модель
Код - C# [Выбрать]
  1. public class PolylineModel
  2.     {
  3.  
  4.         public PolylineModel()
  5.         {
  6.             Coords = new List<Coord>();
  7.             Coords.Add(new Coord {X = 0, Y = 0});
  8.             IsSmoothing = false;
  9.             IsClose = false;
  10.             Thickness = 1;
  11.             Color = (255, 255, 255);
  12.         }
  13.  
  14.         public bool IsSmoothing { get; set; }
  15.         public bool IsClose { get; set; }
  16.         public double Thickness { get; set; }
  17.         public (byte R, byte G, byte B) Color { get; set; }
  18.         public List<Coord> Coords { get; set; }
  19.        
  20.         public bool IsValid
  21.         {
  22.             get
  23.             {
  24.                 if (Coords.Count() <= 1)
  25.                     return false;
  26.                 return true;
  27.             }
  28.         }
  29.  
  30.        public class Coord
  31.         {
  32.             public double X { get; set; }
  33.             public double Y { get; set; }
  34.         }
  35.     }

Команда вызова
Код - C# [Выбрать]
  1. public class PolylineCreator
  2.     {
  3.         [CommandMethod("AddPolyline")]
  4.         public void AddPolyline()
  5.         {
  6.             var acDoc = Application.DocumentManager.MdiActiveDocument;
  7.             var acCurDb = acDoc.Database;
  8.  
  9.             PolylineModel polylineModel = new PolylineModel();
  10.             PolylineWindow pwindow = new PolylineWindow(polylineModel);
  11.             Application.ShowModalWindow(pwindow);
  12.         }
  13.  
  14.     }

Логика интерфейса
Код - C# [Выбрать]
  1. public partial class PolylineWindow : System.Windows.Window
  2.     {
  3.         PolylineModel data;
  4.         public PolylineWindow(PolylineModel polylineModel)
  5.         {
  6.             InitializeComponent();
  7.             data = polylineModel;
  8.             this.DataContext = data;
  9.         }
  10.  
  11.         private void BtnColor_Click(object sender, RoutedEventArgs e)
  12.         {
  13.             ColorDialog colorDialog = new ColorDialog();
  14.             var result = colorDialog.ShowModal();
  15.  
  16.             if (result != true) return;
  17.  
  18.             var acColor = colorDialog.Color;
  19.             byte byt = Convert.ToByte(acColor.ColorIndex);
  20.             int rgb = Autodesk.AutoCAD.Colors.EntityColor.LookUpRgb(byt);
  21.             byte b = Convert.ToByte((rgb & 0xffL));
  22.             byte g = Convert.ToByte((rgb & 0xff00L) >> 8);
  23.             byte r = Convert.ToByte(rgb >> 16);
  24.             data.Color = (r, g, b);
  25.             Color color = Color.FromRgb(r, g, b);
  26.             rectColor.Fill = new SolidColorBrush(color);
  27.  
  28.         }
  29.  
  30.         private void BtnOpenFile_Click(object sender, RoutedEventArgs e)
  31.         {
  32.             var fileDialog = new Microsoft.Win32.OpenFileDialog();
  33.             fileDialog.Filter = "Text files (*.txt)|*.txt|All files(*.*)|*.*";
  34.             var result = fileDialog.ShowDialog();
  35.             if (result != true) return;
  36.             string filePath = fileDialog.FileName;
  37.             string[] coord;
  38.  
  39.             using (StreamReader sr = new StreamReader(filePath))
  40.             {
  41.                 coord = sr.ReadToEnd().Split('\n', ' ').Select(s => s.Trim("\n \r".ToArray())).ToArray();
  42.             }
  43.  
  44.             for (int i = 0; i < coord.Count(); i += 2)
  45.             {
  46.                 data.Coords.Add(new PolylineModel.Coord
  47.                 {
  48.                     X = Convert.ToDouble(coord[i]),
  49.                     Y = Convert.ToDouble(coord[i + 1])
  50.                 });
  51.             }
  52.  
  53.             if (data.IsValid)
  54.                 btnOK.IsEnabled = true;
  55.  
  56.             if (coord.Count() % 2 != 0)
  57.                 data.Coords.RemoveAt(data.Coords.Count - 1);
  58.         }
  59.  
  60.         private void BtnMouseCoord_Click(object sender, RoutedEventArgs e)
  61.         {
  62.             Hide();
  63.             //var window = Autodesk.AutoCAD.ApplicationServices.Application.DocumentWindowCollection.ActiveDocumentWindow;
  64.             //window.Visible = false;
  65.  
  66.             var acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  67.             PromptPointResult pPtRes;
  68.             PromptPointOptions pPtOpts = new PromptPointOptions("");
  69.             pPtRes = acDoc.Editor.GetPoint(pPtOpts);
  70.  
  71.             if (pPtRes.Status != PromptStatus.OK)
  72.                 return;
  73.  
  74.             Point3d plStart = pPtRes.Value;
  75.             data.Coords[0].X = plStart.X;
  76.             data.Coords[0].Y = plStart.Y;
  77.             textX.Text = $"{plStart.X}"; // элемент окна
  78.             textY.Text = $"{plStart.Y}"; // элемент окна
  79.  
  80.             Show();
  81.             //window.Visible = true;
  82.         }
  83.  
  84.         private void BtnOK_Click(object sender, RoutedEventArgs e)
  85.         {
  86.  
  87.             if (!data.IsValid)
  88.                 return;
  89.  
  90.             var acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  91.             var acCurDb = acDoc.Database;
  92.  
  93.             using (var acTrans = acCurDb.TransactionManager.StartTransaction())
  94.             {
  95.                 var acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable;
  96.                 var acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  97.  
  98.                 using (var acPoly = new Polyline2d())
  99.                 {
  100.                     for (int i = 1; i < data.Coords.Count; i++)
  101.                     {
  102.                         acPoly.NonDBAppendVertex(new Vertex2d(
  103.                                 new Point3d(data.Coords[0].X + data.Coords[i].X, data.Coords[0].Y + data.Coords[i].Y, 0), 0, 0, 0, 0
  104.                             ));
  105.                     }
  106.  
  107.                     acPoly.Thickness = data.Thickness;
  108.                     acPoly.Closed = data.IsClose;
  109.                     if (data.IsSmoothing)
  110.                         acPoly.ConvertToPolyType(Poly2dType.FitCurvePoly);
  111.                     acPoly.Color = Autodesk.AutoCAD.Colors.Color.FromRgb(data.Color.R, data.Color.G, data.Color.B);
  112.  
  113.                     acBlkTblRec.AppendEntity(acPoly);
  114.                     acTrans.AddNewlyCreatedDBObject(acPoly, true);
  115.                 }
  116.                 acTrans.Commit();
  117.             }
  118.             DialogResult = true;
  119.             Close();
  120.         }
  121.  
  122.         private void BtnCancel_Click(object sender, RoutedEventArgs e)
  123.         {
  124.             DialogResult = false;
  125.             Close();
  126.         }
  127.        
  128.     }

Окно



Само задание нелогичное, но тут уже не моя вина)

Оффлайн TeltroАвтор темы

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
и в данный момент времени оффаюсь до завтра, чуть что - заранее спасибо.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Teltro,
Так как диалог модальный, то Дмитрий Загорулькин абсолютно прав.
В BtnMouseCoord_Click должно быть что-то такое:
Код - C# [Выбрать]
  1.            using (EditorUserInteraction UI = acDoc.Editor.StartUserInteraction(this)) {
  2.              // Здесь код запроса точки. Диалог должен скрыться автоматически
  3.            }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн RevitTormentor

  • ADN OPEN
  • ***
  • Сообщений: 162
  • Карма: 6
Хз, может что не так делаю, но перед тем как использовать GetPoint я скрывал окно с помощью Hide(), после показывал Show(), но в результате, при нажатии моих кнопок "ОК" и "Отмена" автокад ломался, но без скрытия - всё ок.
...Но тут же подумал, может это всё потому что в методе обработки "ОК" и "Отмена" было DialogResult = true и Close().

в окне WPF
 
Код - C# [Выбрать]
  1.      
  2. BtnMouseCoord_Click()
  3. {
  4. ...    
  5. this.Hide();
  6.             Autodesk.AutoCAD.Internal.Utils.SetFocusToDwgView();
  7. ... действия
  8.         this.Show();
  9. }
  10.  

кнопки ОК и Close в WPF
Код - C# [Выбрать]
  1. public bool YN=false;
  2. void Button_OK(object sender, RoutedEventArgs e)
  3. {
  4.             YN = true;
  5.             this.Close();
  6. }
  7.  
  8. void Button_Close(object sender, RoutedEventArgs e)
  9. {
  10.             this.Close();
  11. }
  12.  
после закрытия окна WPF проверка
Код - C# [Выбрать]
  1. if(YN)
  2. {
  3.  
  4. }
  5.  

Оффлайн TeltroАвтор темы

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Спасибо, все работает