using Autodesk.Revit.UI;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media.Imaging;
using System.Windows.Interop;
using System.Windows.Forms;
using Autodesk.Revit.DB;
namespace Copy_Zoom
{
class App : IExternalApplication
{
RibbonItem _button;
public string _buttonText { get; set; }
///
/// Singleton external application class instance.
///
internal static App _app = null;
///
/// Provide access to singleton class instance.
///
public static App Instance
{
get { return _app; }
}
//Revit 실행 시 작동
public Result OnStartup(UIControlledApplication a)
{
//뷰 바꾸는 이벤트 감지
a.ViewActivated += new EventHandler(OnViewActivated);
a.ViewActivating += new EventHandler(OnViewActivating);
//_app = this;
////판넬, 토글 버튼 만들기
//RibbonPanel panel = a.CreateRibbonPanel("Copy_Zoom");
//PushButtonData data = new PushButtonData(
// "Toggle", "Off", @"C:\test\Copy_Zoom\Copy_Zoom\bin\Debug\Copy_Zoom.dll", "Copy_Zoom.Copy_Zoom_State");
//data.AvailabilityClassName = "ToggleButton.Availability";
////그림 및 도움말 넣기
//data.LargeImage = convertFromBitmap(KMBIM2021.Resources.Zoom_Image);
//data.ToolTip = "뷰 위치를 고정합니다.";
//_button = panel.AddItem(data);
return Result.Succeeded;
}
/*
* ViewActivatingEventArgs는 바꾸기 전의 뷰를 가리키고, ViewActivatedEventArgs는 바꾼 뒤의 뷰를 가리킨다.
* ViewActivatingEventArgs를 사용해 바꾸기 전의 뷰의 좌표를 구해 newZoomCornerList에 저장하고,
* ViewActivatedEventArgs를 사용해 선택된 다른 뷰에 newZoomCornerList를 붙여 넣는다.
* 유저가 다른 뷰 선택한 것을 인식하여 계속해서 뷰 정보를 복사해 붙여 넣는다.
* 이벤트를 사용하기 때문에 토글이 켜져 있으면 뷰가 바뀔때마다 프로그램이 실행되어 이 프로그램이 실행된 뒤에 다른 레빗 기본 명령을 사용할 수 있다.
*/
static IList NewActiveViewList = new List();
public IList newZoomCornerList = new List();
static Autodesk.Revit.DB.View NewcurrentView = null;
// 전환되기 전의 뷰에서 위치 정보를 복사한다.
public void OnViewActivating(object sender, Autodesk.Revit.UI.Events.ViewActivatingEventArgs args)
{
if (KMBIM.Copy_Zoom_State.uidoc == null) return;
if (_buttonText == "On")
{
//현재 뷰 조사
NewActiveViewList = KMBIM.Copy_Zoom_State.uidoc.GetOpenUIViews();// 현재 열려 있는 모든 뷰 가져오기
NewcurrentView = args.CurrentActiveView;
newZoomCornerList = NewCopyViewState(NewcurrentView, NewActiveViewList);//현재 뷰 위치 구해서 위치정보 복사
}
}
// 전환된 후의 뷰에 위에서 복사한 위치 정보를 붙여 넣는다.
public void OnViewActivated(Object sender, Autodesk.Revit.UI.Events.ViewActivatedEventArgs args)
{
if (KMBIM.Copy_Zoom_State.uidoc == null) return;
if (_buttonText == "On")
{
// 토글 버튼 실행 했을 시의 위치정보와 새롭게 구한 위치 정보가 다르면 새롭게 구한 위치정보를 붙여 넣는다.
if (newZoomCornerList[0] != KMBIM.Copy_Zoom_State.zoomCornerList[0])
{
NewPasteViewState(args.CurrentActiveView, NewActiveViewList, newZoomCornerList);
}
//토글버튼 눌렀을 때의 위치 정보를 가져와야 하기 때문에 전역변수를 사용해서 Copy_Zoom_State에서 정보를 가져와 붙여 넣는다.
else if (newZoomCornerList[0] == KMBIM.Copy_Zoom_State.zoomCornerList[0])
{
KMBIM.Copy_Zoom_State.PasteViewState(KMBIM.Copy_Zoom_State.currentView, KMBIM.Copy_Zoom_State.activeViewList, KMBIM.Copy_Zoom_State.zoomCornerList);
}
}
}
///
/// 토글 버튼 누르고 한번 뷰 바꾼 뒤부터 실행되어 뷰 위치 정보를 가져오는 함수
///
/// 현재 뷰
/// 활성화 되어 있는 뷰 리스트
///
static public IList NewCopyViewState(Autodesk.Revit.DB.View currentView, IList activeViewList)
{
UIView currentUIView = null;
IList newFoundZoomCornerList = new List();
//현재 뷰 찾기
foreach (UIView activeUIView in activeViewList)
{
if (activeUIView.ViewId == currentView.Id)
{
currentUIView = activeUIView;
}
else
break;
}
if (currentUIView != null)
{
//줌 코너 찾기
newFoundZoomCornerList = currentUIView.GetZoomCorners();
}
return newFoundZoomCornerList;
}
///
/// 토글 버튼 누르고 한번 뷰 바꾼 뒤부터 실행되어 뷰 위치 정보를 붙여 넣는 함수
///
/// 현재 뷰
/// 활성화 되어 있는 뷰 리스트
/// 복사한 줌 위치 정보
static public void NewPasteViewState(Autodesk.Revit.DB.View currentView, IList activeViewList, IList zoomCornerList1)
{
UIView currentUIView = null;
//currentView = uiapp.ActiveUIDocument.ActiveView;
//현재 뷰 찾기
if (currentView != null)
{
foreach (UIView activeUIView in activeViewList)
{
if (activeUIView.ViewId == currentView.Id)
{
currentUIView = activeUIView;
}
}
}
if (currentUIView != null)
{
using (Transaction tr = new Transaction(KMBIM.Copy_Zoom_State.doc))
{
tr.Start("start");
//zoom 데이터 붙여넣기
currentUIView.ZoomAndCenterRectangle(zoomCornerList1[0], zoomCornerList1[1]);
tr.Commit();
}
}
}
private void A_ViewActivated(object sender, Autodesk.Revit.UI.Events.ViewActivatedEventArgs e)
{
throw new NotImplementedException();
}
//Revit 꺼질 때 작동
public Result OnShutdown(UIControlledApplication a)
{
return Result.Succeeded;
}
//토글 버튼 On/Off 교대로 표시되게 하기
public void Toggle()
{
string s = _button.ItemText;
_button.ItemText = s.Equals("Off") ? "On" : "Off";
_buttonText = _button.ItemText;
}
//토글 버튼에 이미지 넣는 함수
BitmapSource convertFromBitmap(Bitmap bitmap)
{
return Imaging.CreateBitmapSourceFromHBitmap(
bitmap.GetHbitmap(),
IntPtr.Zero,
System.Windows.Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
}
}
}