2016-10-17 3 views
1

내 Revit Add 기능 중 하나를 다시 작성하여 WPF를 Windows Forms보다 모양과 기능이 좋기 때문에 MVVM과 함께 WPF를 사용하도록 수정하고 싶습니다.WPF Revit의 최적 시작점

Jeremy Tammik의 Revit Template Wizzard를 Form 기반의 추가 기능에 사용했지만 WPF 사용자 정의 컨트롤을 추가해도 작동하지 않는 것 같습니다 (런타임 오류로 인해 xaml 리소스를 찾을 수 없음).

예를 들어 (Excel 스프레드 시트에서 자료를 추가 할 AddMaterials, here is the github link) WPF MVVM revit add가 발견되었지만 최상위 레벨에서 볼 것으로 예상되는 내용을 따르지 않습니다.

  • Revit Add에는 Revit에 DLL 등록 및 액세스 방법 (리본 패널 버튼 등)을 알려주는 app.cs 파일이 있습니다.
  • Windows WPF 앱은 app.xaml을 최상위 엔트리 포인트로 사용합니다.
  • Add Materials 프로젝트에는 클래스 라이브러리가 있어야한다는 메시지가 표시되지 않지만보기는 UserControls 을 사용하지 않고 선호하는 Windows입니다. 그러나 Visual Studio에서는 클래스 라이브러리 형식 프로젝트에 대한 창을 추가 할 수 없습니다.

세 번째 문제는 단순히 WPF 응용 프로그램 프로젝트의 창을 클래스 라이브러리 프로젝트로 복사하면 쉽게 해결됩니다. 그러나 클래스 라이브러리가 템플릿에서 app.cs 코드를 따르지 않고 Revit에서 인스턴스화하는 방법을 실제로 이해하지 못합니다. 다른 사람이 이런 식으로 추가 기능을 만들 수 있습니까? 그렇다면 어떤 트릭이나 토론에 도움이 될 수 있습니까? 누구든지 Visual Studio 용 WPF Revit 추가 기능 템플릿을 만들었습니까?

WPF 창을 추가하고 인스턴스화하려고하면 xaml 리소스 (System.IO.IOException : 리소스 'xxxx.xaml'을 찾을 수 없음)를 찾을 수 없다는 오류가 발생합니다. 나는이 오류에 대한 인터넷 검색 때 발견 된 조언에 따라이 문제를 해결하려했지만 아무 소용이 없습니다. 나는 폼 기반 프로젝트에 있다고 생각하고 있으며 폼이없는 새로운 프로젝트로 시작해야 할 수도 있습니다.

이제 Revit AddIn Wizzard로 시작하여 WPF를 사용할 수 있다는 것을 확인했습니다. . . 나는 처음부터 시작하여 다른 프로젝트에서 생성 된 창에서 복사하여 실행하도록했습니다 (다양한 참조, 네임 스페이스 등을 추가 한 후). 그래서 제 문제는 폼팩터가 이미 추가 된 원래 프로젝트의 문제인 것으로 보입니다.

답변

2

예, 저는 WPF를 사용하여 Revit Addins를 만들고 있습니다. 잘 작동한다. SDK 샘플에서 자신 만의 WPF 템플릿을 쉽게 만들 수 있습니다.

  1. Autodesk 제공 SDK 샘플 중 하나에서 시작하십시오. "DockableDialogs"샘플을 사용했습니다. 나는 이것이 작동하는 것을 알고있다, 당신의 주행 거리는 다른 것과 다를지도 모른다. UI에 도킹 된 창이 아닌 창을 찾고 있다면 다른 샘플 (아마도 AddMaterials 샘플)이 더 간단 할 것입니다.
  2. Visual Studio를 사용하여 샘플을 템플릿으로 변환했습니다. 파일 - 템플릿 내보내기 -> "DockableDialogs"또는 다른 WPF 샘플 프로젝트를 선택하십시오.
  3. 방금 ​​만든 템플릿을 기반으로 새 프로젝트를 만듭니다. 이 방법은 WPF 내부 비트를 올바르게 연결하는 가장 쉬운 방법입니다.

저는 특별히 AddMaterials 프로젝트에 익숙하지 않지만 글 머리 기호를 명확히하기 위해 노력하고 있습니다.

  1. REVIT 추가 기능 - 그것은 파일 이름 (app.cs) 아니지만 오히려 그들이 IExternalApplication 또는 IExternalCommand를 확장해야합니다. 리본 단추에서 명령을 실행하는 대신 xaml 인터페이스를 만드는 경우 엔트리 포인트로 'IExternalApplication'을 사용합니다. 샘플에서 이런 일을 찾습니다

    public class ThisApplication : IExternalApplication ... 
    
  2. 내가 최고 수준의 app.xaml를 사용하지 않지만, 대신 된 Revit 응용 프로그램에 의해 호출된다 page.xaml 페이지가 있습니다. 필자의 경우에는 IDockablePaneProvider 클래스를 확장 한 Windows가 아닌 Pages입니다. 이것들은 응용 프로그램에 등록되어야합니다. 그런 다음 창을 보이거나 숨길 수 있습니다. 나는 이것이 Windows에서는 더 간단하다고 생각하지만 직접하지는 않았다.

    public partial class MainPage : Page, Autodesk.Revit.UI.IDockablePaneProvider ... 
    
  3. 예는, 프로젝트가 IExternalApplication 또는 연장하는 적어도 하나의 클래스의 모음이라고 의미에서 클래스 라이브러리입니다 : 고정 가능한 창를 들어, xaml.cs 같은 뭔가를 시작해야 IExternalCommand. 독립 실행 형 응용 프로그램을 만드는 것이 아니라 기존 Windows 응용 프로그램 (Revit)에 기능을 추가한다는 것을 기억하십시오. Revit은 ThisApplication 클래스를 인스턴스화 한 다음 Revit 응용 프로그램이 시작될 때 .OnStartup() 메서드를 호출합니다. 그래도 .xaml 또는 .cs 파일을 프로젝트에 추가하지 않아도됩니다. Ctrl-Shift-A을 사용하여 VS 커뮤니티 2015를 사용하여 할 수 있습니다. 나는 사전 WPF 경험이없는 REVIT에서 WPF UI를 구현할 수 있었고, 난 진짜 프로그래머가 아니에요, 그래서 확실히 가능 -

는 희망이 당신이 시작 가져옵니다. 행운을 빕니다!

부록

기존 REVIT 추가 기능에 WPF 요소를 추가 할 경우 여기의 지침에 따라 수 있습니다

How can I connect xaml and xaml.cs files가 궁극적으로 내가 쉽게 만든 템플릿에 내 추가 기능 코드를 마이그레이션 발견 작업 샘플에서이 접근법을 시도 할 수도 있습니다.

+0

의견을 보내 주셔서 감사합니다. 나는 당신의 요점을 이해하고, 특히 제 질문의 틀을 잡는 방법에 도움이되는 것을 찾습니다. Revit의 측면에서 IExternalApplication 클래스는 리본 패널 버튼으로 등록 된 추가 기능을 가질 수있는 곳입니다. . . WPF 추가 기능에이 기능이 있습니까? Add Materials가 없기 때문에 물어 봅니다. 코드를 추가하더라도 코드를 무시하는 것 같습니다 (OnStartup을 사용하여이 작업을 수행함). –

+0

@PaulGibson AddMaterials는 단일 명령을 사용합니다. IExternalCommand,이 명령은 var window = new MaterialsView {DataContext = browser}를 호출합니다. 창을 만들 수 있습니다. 이 명령은 .addin 파일에서로드됩니다. 내가하는 것처럼 IExternalApplication을 사용하면 OnStartup을 통해 명령을 추가 할 수 있습니다. AddMaterials에 대한 .addin을 보면이 행이 있습니다 : AddMaterials.Command. 예를 들어 "newApp"라는 IExternalApplication을 추가하면 newNamespace.newApp을 추가합니다. – 0w3n

+0

Doh! 나는 그것을 여러 번 보았지만 그것을 잡지 못했다! –