Сообщество программистов Autodesk в СНГ

ADN Club => Revit API => Тема начата: Bazinga от 09-10-2017, 17:29:16

Название: Создание пользовательской надстройки для Revit
Отправлено: Bazinga от 09-10-2017, 17:29:16
В ходе создания надстройки Revit столкнулась с проблемой, что Autidesk.Revit.DB и Syste.Window.Forms не могут совместно использоваться (Form является неоднозначной ссылкой между Autodesk.Revit и System.Windows). Как можно обойти данную проблему?
Название: Re: Создание пользовательской надстройки для Revit
Отправлено: Александр Пекшев aka Modis от 09-10-2017, 17:42:58
Этот вопрос даже не относится к Ревиту)
У вас есть два варианта:
1. В блоке using прописать сокращенную ссылку пространство имён (не помню как это правильно называется). Типа
Код - C# [Выбрать]
  1. using WinF = System.Window.Forms;
И далее по коду уже использовать эту ссылку, типа
Код - C# [Выбрать]
  1. var cm = WinF.ContextMenu;
2. Второй вариант - прям в коде писать полное указание на пространство имён. Типа
Код - C# [Выбрать]
  1. var cm = System.Window.Forms.ContextMenu;

И еще вариант - установить ReSharper - он вам все это подскажет
Название: Re: Создание пользовательской надстройки для Revit
Отправлено: Александр Ривилис от 09-10-2017, 19:24:24
В блоке using прописать сокращенную ссылку пространство имён (не помню как это правильно называется)
Псевдоним (алиас) имени.
Название: Re: Создание пользовательской надстройки для Revit
Отправлено: Bazinga от 10-10-2017, 08:47:50
Этот вопрос даже не относится к Ревиту)
Не сказала бы))) Библиотека Revit не дает использовать стандартную библиотеку для winForm. В первый раз с таким сталкиваюсь.
Название: Re: Создание пользовательской надстройки для Revit
Отправлено: Александр Ривилис от 10-10-2017, 09:05:15
Библиотека Revit не дает использовать стандартную библиотеку для winForm.
Пересечения в именах пространств имён есть не только у Revit. И что значит не даёт использовать? Извини, но это глупость.
Название: Re: Создание пользовательской надстройки для Revit
Отправлено: Александр Пекшев aka Modis от 10-10-2017, 10:12:19
Bazinga, давайте на примере:
Допустим, я создал супер-пупер САПР приложение под названием PupkinCAD. И я решил предусмотреть возможность написания плагинов под мое приложение, поэтому я создал библиотеку Vasya.dll. В моём приложении есть свое окно с сообщением. И я когда я делал библиотеку, то создал пространство имен Windows в котором создал класс MessageBox со статическим методом Show. Вот мне так захотелось! И я когда это делал, то совершенно не смотрел на стандартные пространства имён. И это нормально!
И вот вы решили написать мега плагин под мое приложение - вы создаете проект и добавляете ссылку на Vasya.dll и где-то в коде решили использовать мое окно с сообщением. НО! У вас есть еще ссылка на PresentationFramework.dll, так как вы использовали в своем плагине обычные окна. В коде, где использовалось стандартное окно и планируется использовать мое окно есть ссылки на пространства имён:
Код - C# [Выбрать]
  1. using System.Windows;
  2. using PupkinVasya.Windows;
Вы пишите в коде:
Код - C# [Выбрать]
  1. MessageBox.Show("Hello world");
и при попытке компиляции получаете ту самую ошибку о конфликте имён. Ну, вам повезло - еще до попытки компиляции IDE вам сообщит об ошибке.
Вот тут Вам и придется применять один из двух подходов, которые я описал в первом ответе.

А вообще - в любой книжке по C# об этом написано. Я конечно вас понимаю - сам до сих пор ни одной не прочитал, поэтому можете просто погуглить. Например вот (https://metanit.com/sharp/tutorial/3.25.php).

P.S. Не забывайте нажимать кнопку "Решение", если получили нужный вам ответ
Название: Re: Создание пользовательской надстройки для Revit
Отправлено: Александр Ривилис от 10-10-2017, 12:33:40
Я конечно вас понимаю - сам до сих пор ни одной не прочитал
:o
С остальным согласен полностью.
Название: Re: Создание пользовательской надстройки для Revit
Отправлено: Bazinga от 10-10-2017, 16:12:06
А вообще - в любой книжке по C# об этом написано. Я конечно вас понимаю - сам до сих пор ни одной не прочитал, поэтому можете просто погуглить. Например вот
Я обычно msdn использую при необходимости) впервые с дополнениями работаю ::)
И спасибо за примеры) 
Название: Re: Создание пользовательской надстройки для Revit
Отправлено: Bazinga от 10-10-2017, 16:14:21
И что значит не даёт использовать? Извини, но это глупость.
Не допускает использование стандартных элементов (combobox, textbox etc.) Глупость, не глупость, а это мой первый опыт в этой области.
Название: Re: Создание пользовательской надстройки для Revit
Отправлено: Александр Ривилис от 10-10-2017, 16:26:49
Не допускает использование стандартных элементов (combobox, textbox etc.)
Допускает. Но в данном случае требует указания полного квалифицированного имени (или алиаса) для класса, чтобы компилятор мог понять какой именно класс (из какой сборки) должен использоваться.
это мой первый опыт в этой области.
Это всё объясняет. Опыт приходит со временем.
Название: Re: Создание пользовательской надстройки для Revit
Отправлено: Виктор Чекалин от 10-10-2017, 18:26:53
Библиотека Revit не дает использовать стандартную библиотеку для winForm.
Мы же на форуме по Revit API. Тут надо говорить, что это плохая библиотека WinForms не дает использовать библиотеку Revit :)
Я обычно msdn использую при необходимости) впервые с дополнениями работаю
И спасибо за примеры) 
Вот ссылочка на MSDN (https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/namespaces/using-namespaces). Там как раз приведен пример, когда один и тот же класс в разных неймспейсах определен.

В дополнение к сказанному, добавлю, что можно алиас еще применить и для класса, не только для namespace. Например, если вы не используете или используете очень редко класс Autodesk.Revit.Db.Form, но активно применяете System.Windows.Forms.Form, то можно написать так:
Код - C# [Выбрать]
  1. using Autodesk.Revit.Db;
  2. using System.Windows.Forms;
  3. using Form = System.Windows.Forms.Form;
  4.  
Теперь при использовании класса Form не будет возникать ошибки, что данный класс объявлен в двух namespaces.