[ INotifyPropertyChanged 는 언제 쓰는 것일까? ]

 

원본 속성 또는 대상 속성이 변경되면 다른 항목이 자동으로 업데이트되도록 하고 싶을 때, INotifyPropertyChanged 를 구현한다.

 

사용예시) 관리자가 추가,수정,삭제 될때마다 변동된 데이터를 바로 전체 프로그램에 반영시키고 싶을 경우

 

 

[ INotifyPropertyChanged 구현방법 ]

 

1.   INotifyPropertyChanged를 상속받는다.

2.   인터페이스를 구현한다.

 

- 빨간 물결밑줄이 쳐진 INotifyPropertyChanged 위에 마우스 커서를 올려놓으면 뜨는 창에서 잠재적 수정 사항 표시를 클릭한다 

- using System.ComponentModel; 을 클릭한다

- 다시 한번더 , 빨간 물결밑줄이 쳐진 INotifyPropertyChanged 위에 마우스 커서를 올려놓으면 뜨는 창에서 잠재적 수정 사항 표시를 클릭한다 

- 인터페이스 구현을 클릭한다

- 해당 코드가 생성된 것을 확인한다.

 

3.   OnPropertyChanged 메서드를 생성한다.

-  public event PropertyChangedEventHandler PropertyChanged; 코드 아래에 밑의 코드를 추가시킨다

 

        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }

 

-     OnPropertyChanged 메서드란,  name 에 해당하는 이름을 갖는 데이터에 변화가 생길때마다 이벤트를 발생시키는 메서드이다.

 

4.   변수의 set 접근자 안에 OnPropertyChanged 메서드를 호출한다.

 

- 변수의 set 접근자 안에 밑의 코드를 넣는다.

 

OnPropertyChanged("변수이름");

- 예시코드입니다. 그럼 예를들어 product 이름이 바꼈을 경우 OnPropertyChanged()가 호출되어 이벤트 발생시킨다

5.   Xaml에 TwoWay-binding 하기

- xaml 에서 Text="{Binding 바인딩시킬 데이터 이름 , UpdateSourceTrigger=PropertyChanged}" 을 넣는다. 그러면 사용자가 예를들어 관리자의 이름을 변경했을 경우 바로 Property가 Changed 된다.

- 코드 예시

 

[ 참고자료 ]

 

INotifyPropertyChanged 구현시 참고한 사이트

 https://docs.microsoft.com/ko-kr/dotnet/framework/wpf/data/how-to-implement-property-change-notification

- https://docs.microsoft.com/ko-kr/dotnet/framework/wpf/data/how-to-control-when-the-textbox-text-updates-the-source

 

TwoWay,OneWay 등등의 개념 잡을 때 참고한 사이트

https://docs.microsoft.com/ko-kr/dotnet/api/system.windows.data.bindingmode?view=netframework-4.8#System_Windows_Data_BindingMode_TwoWay

반응형

오류메세지

Starting a transaction from an external application running outside of API context is not allowed

 

원인

1. 모든 Revit API 호출은 "API context" 내에서 수행되어야
2.
 다른 thread에서 API 액세스하는 경우
3. 이러한 현상은 Form 만들고 Button.onclick 이벤트로 API 호출할 자주 발생한다.

 

해결방법

IExternalEventHandler 을 통해 외부에서 event 발생되게한다.

 

방법1. IExternalEventHandler 생성
방법2.  Execute method 시행한다.
(Execute method Revit API context에서 실행됨)

방법3. ExternalEvent 생성(방금 생성된 event handler사용)
방법4. Revit API context에서 작업을 수행해야 경우, external event 공지하기( my_external_event.Raise() 이용)

 

오류 해결방법 참고사이트

https://stackoverflow.com/questions/31490990/starting-a-transaction-from-an-external-application-running-outside-of-api-conte

 

Starting a transaction from an external application running outside of API context is not allowed

Starting a transaction from an external application running outside of API context is not allowed. cannot start transaction.

stackoverflow.com

IExternalEventHandler 생성 참고사이트

https://thebuildingcoder.typepad.com/blog/2015/12/external-event-and-10-year-forum-anniversary.html

 

External Events and 10 Year Forum Anniversary

Ten years ago today, on December 9, 2005, Jim Quanci posted the first thread on the Revit API discussion forum. This was pointed out by Revitalizer, one of the forum's chief contributors. Thank you very much for this, Revitalizer, and thank you even more f

thebuildingcoder.typepad.com

 

반응형

1) 창(window) 이 떠있어도 Revit의 다른 기능을 사용하고 싶은 경우

* show를 사용하여 window를 띄울경우, window 에서 실행하는 작업이 Revit 에 영향을 주지 못하기 때문에 ExternalEventHandler로 이벤트를 사용해주어야한다.

 

window.Show()

Revit_Window window = new Revit_Window();
WindowInteropHelper wi = new WindowInteropHelper(window);
wi.Owner = Autodesk.Windows.ComponentManager.ApplicationWindow;
window.Show();

 

 

2) 창(window) 가 열리고 닫히기 전까지 Revit 의 다른 기능을 사용하지 못하고 싶은 경우

 

window.ShowDialog()

Revit_Window window = new Revit_Window();
WindowInteropHelper wi = new WindowInteropHelper(window);
wi.Owner = Autodesk.Windows.ComponentManager.ApplicationWindow;
window.ShowDialog();

 

 

 

 

 

 

 

반응형

오류메세지

 

해결방안

 

.rte -> .rvt file 로 변경한다

반응형

방법

 

1)    Revit  속성창 들어가기( 작업표시줄에서 revit 우클릭

2)    바로가기 > 대상(T): 에서 원하는 언어로 내용 수정

 

- 영어 : Autodesk\Revit 2017\Revit.exe" /language ENU 

- 한국어 : Autodesk\Revit 2017\Revit.exe" /language KOR 

- 그외 언어

 

반응형

 

목표

 

사용자가 TextBox 에 값 입력하기위해 마우스커서 올려놓았을때 자동으로 값이 Clear 되고
새로운 값을 입력하지 않은 채 커서를 옮기면 이전에 입력해놓은 값이 유지되는 기능

 

 

 

 

 

방법

 

1. 마우스 포인터가 컨트롤의 영역으로 들어왔을때 "" 값을 임의로 넣어준다.

2. TextBox 안의 내용에 변화를 감지하여 아무런 변화가 없다면 미리 저장해 놓은 이전의 값을 저장

 

 

xaml

<TextBox x:Name="tbx_Value1" Grid.Row="0" Grid.Column="1" Height="25" GotFocus="Tbx_Value1_GotFocus" LostFocus="Tbx_Value1_LostFocus" TextChanged="Tbx_Value1_TextChanged"/>
<TextBox x:Name="tbx_Value2" Grid.Row="1" Grid.Column="1" Height="25" GotFocus="Tbx_Value2_GotFocus" LostFocus="Tbx_Value2_LostFocus" TextChanged="Tbx_Value2_TextChanged"/>
<TextBox x:Name="tbx_Value3" Grid.Row="2" Grid.Column="1" Height="25" GotFocus="Tbx_Value3_GotFocus" LostFocus="Tbx_Value3_LostFocus" TextChanged="Tbx_Value3_TextChanged"/>

xaml.cs

    public partial class TextboxEx_Window : Window
    {
        private ElementId LineId;
        private Document doc;
        string Value1 = "0";
        string Value2 = "0";
        string Value3 = "0";

        public TextboxEx_Window(ExternalCommandData commandData, ElementId Id, Element element)
        {
            InitializeComponent();
            LineId = Id;
            doc = commandData.Application.ActiveUIDocument.Document;
            SetValue();
        }

        private void SetValue()
        {
            tbx_Value1.Text = "0";
            tbx_Value2.Text = "0";
            tbx_Value3.Text = "0";
        }

        // TextBox 안의 내용에 변화가 생겼을때
        private void Tbx_Value1_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (tbx_Value1.Text == "0") return;
            if (!Value1.Equals(tbx_Value1.Text) && !tbx_Value1.Text.Equals(""))
            { Value1 = tbx_Value1.Text; }
        }
        private void Tbx_Value2_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (tbx_Value2.Text == "0") return;
            if (!Value2.Equals(tbx_Value2.Text) && !tbx_Value2.Text.Equals(""))
            { Value2 = tbx_Value2.Text; }
        }
        private void Tbx_Value3_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (tbx_Value3.Text == "0") return;
            if (!Value3.Equals(tbx_Value3.Text) && !tbx_Value3.Text.Equals(""))
            { Value3 = tbx_Value3.Text; }
        }

        //  textbox 가 클릭되었을때 
        private void Tbx_Value1_GotFocus(object sender, MouseEventArgs e)
        {
            if (tbx_Value2.Text.Equals("")) { tbx_Value2.Text = Value2; }
            if (tbx_Value3.Text.Equals("")) { tbx_Value3.Text = Value3; }
            tbx_Value1.Text = "";
        }
        private void Tbx_Value2_GotFocus(object sender, MouseEventArgs e)
        {
            if (tbx_Value1.Text.Equals("")) { tbx_Value1.Text = Value1; }
            if (tbx_Value3.Text.Equals("")) { tbx_Value3.Text = Value3; }
            tbx_Value2.Text = "";
        }
        private void Tbx_Value3_GotFocus(object sender, MouseEventArgs e)
        {
            if (tbx_Value1.Text.Equals("")) { tbx_Value1.Text = Value1; }
            if (tbx_Value2.Text.Equals("")) { tbx_Value2.Text = Value2; }
            tbx_Value3.Text = "";
        }

        // textbox 가 클릭되지 않았을때 
        private void Tbx_Value1_LostFocus(object sender, MouseEventArgs e)
        { if (tbx_Value1.Text == "") { tbx_Value1.Text = Value1; }}
        private void Tbx_Value2_LostFocus(object sender, MouseEventArgs e)
        { if (tbx_Value2.Text == "") { tbx_Value2.Text = Value2; }}
        private void Tbx_Value3_LostFocus(object sender, MouseEventArgs e)
        { if (tbx_Value3.Text == "") { tbx_Value3.Text = Value3; }}
    }

 

반응형

 

목표) 다른 프로젝트에 설정되어있는 Standard 값으로 현재 프로젝트 Standard를 변경한다

 

 

 

방법)

 

1. 복사해올 프로젝트와 붙여넣을 프로젝트를 킨다.

 

복사해올 복사한 것을 적용한 프로젝트  2 가지를 모두 키지 않는다면 이런 오류메세지가 뜬다 .

 

 

2.    붙여넣을 프로젝트에서 Manage > Transfer Project Standards 선택

 

 

3. 설정하기

- 창의 Copy from 의 우측 combobox에서 Standard 를 복사해올 요소를 선택한다.

- 현재 프로젝트의 어떤 요소에 적용할 것인지 checkbox로 선택한다.

반응형

 

[ 목표 ]

projec() 활용하여 교차하는 point 찾기

 

[ 방법 ]

XYZ tray2Direction = ((ray2.Location as LocationCurve).Curve as Line).Direction;
Xyz tray2Origin = ((tray2.Location as LocationCurve).Curve as Line).Origin;
Xyz tray3Origin = ((tray3.Location as LocationCurve).Curve as Line).Origin;
var projectLine = Line.CreateBound( tray2Origin + tray2Direction * 100, tray2Origin - tray2Direction * 100);
XYZ projectPoint = projectLine.Project (tray3Origin).XYZPoint;

 

반응형

+ Recent posts