วันเสาร์ที่ 23 มีนาคม พ.ศ. 2562

สร้าง Ribbon button ใน Revit Addins

ต่อจากบทความที่แล้ว เมื่อสร้าง โปรแกรมด้วย Wizard จะสร้าง App.cs ด้วย ซื่งสามารถ สร้าง Panel Button ได้

ตัวอย่าง การสร้าง
ให้ไปที่ Project Explorer และทำการสร้าง Image เพื่อเป็น Icon ก่อน
โดย
Add->Resource


double click ที่ Resouce1.resx

->Add Image

เขียนรูปแล้ว Save


ใน Code ให้เพิ่ม ใน App.cs


namespace RevitAddin1
{
    class App : IExternalApplication { 
    
        static string AddInPath = Assembly.GetExecutingAssembly().Location;
        static string ButtonIconsFolder = Path.GetDirectoryName(AddInPath);
        static UIApplication uiApplication = null;
        public Autodesk.Revit.UI.Result OnStartup(UIControlledApplication application)
        {
            try
            {
                // create customer Ribbon Items
                CreateRibbonPanel(application);

                return Autodesk.Revit.UI.Result.Succeeded;
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.ToString(), "Ribbon Sample");
                return Autodesk.Revit.UI.Result.Failed;
            }
        }

        private void CreateRibbonPanel(UIControlledApplication application)
        { // build button here
            string tabName = "CAAD"; // panale name
            System.Windows.Forms.MessageBox.Show(AddInPath);
            RibbonPanel ribbonPanel = application.CreateRibbonPanel("CAAD Project");

            // Create two push buttons

        //    PushButtonData button2 = new PushButtonData("Button2", "listData",
        //       AddInPath, "RevitAddin1.Command2");

            {
                PushButton pushButton = ribbonPanel.AddItem(new PushButtonData("Button1", "seeInLink", AddInPath, "RevitAddin1.Command")) as PushButton;
// ชื่อ RevitAddin1.Command ต้องตรงกับใน Command.cs จะเป็น Namespace.Class
                pushButton.Image = LoadImage(Resource1.Image1);
                pushButton.LargeImage = LoadImage(Resource1.Image1);
            }
        }

        public Autodesk.Revit.UI.Result OnShutdown(UIControlledApplication application)
        {
            return Autodesk.Revit.UI.Result.Succeeded;
        }

        public static BitmapImage LoadImage(Bitmap imageToLoad)
        {
            BitmapImage image2;
            BitmapImage image = new BitmapImage();
            try
            {
                Bitmap bitmap = imageToLoad;
                MemoryStream stream = new MemoryStream();
                bitmap.Save(stream, ImageFormat.Png);
                image.BeginInit();
                image.StreamSource = stream;
                image.EndInit();
                image2 = image;
            }
            catch (System.Exception exception1)
            {
                image2 = null;
            }
            return image2;
        }
    }

}

จะแสดงใน Tab Addins


ตัวอย่าง อยู่ใน
RevitAddins1.rar





ให้ DDD กลายเป็น Addins ใน Revit

ตัวอย่างจาก เอกสาร กรณี 2017 ใช้ตามนี้
https://thebuildingcoder.typepad.com/blog/2016/05/visual-studio-vb-and-c-net-revit-2017-add-in-wizards.html

กรณี 2019
https://thebuildingcoder.typepad.com/blog/2018/09/revit-2019-visual-studio-net-add-in-wizards.html

ให้สร้าง Project จะมี Revit addins
จากนั้นให้ทำการ ADD Existing file จาก project ddd
แล้วแก้ Code ที่ Command.cs



namespace RevitAddin1
{
    [Transaction(TransactionMode.Manual)]
    public class Command : IExternalCommand
    {
        public Result Execute(
          ExternalCommandData commandData,
          ref string message,
          ElementSet elements)
        {
            w1.RevitW1.seeIntoLink(commandData);  // ตัวอย่าง คำสั่งที่ ต้องการ Call

            return Result.Succeeded;

   

        }
    }


กรณีทำ Ribbon menu ให้ สร้าง ตามตัวอย่าง
https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2015/ENU/Revit-API/files/GUID-1547E521-59BD-4819-A989-F5A238B9F2B3-htm.html

วันเสาร์ที่ 16 มีนาคม พ.ศ. 2562

Compare Revit 2 File

โดยหลักการ เปิด Revit 2 File ต้องการหาข้อแตกต่าง ระหว่างไฟล์

Reference
https://adndevblog.typepad.com/aec/2012/10/accessing-data-from-linked-file-using-revit-api.html

Live video
https://web.facebook.com/archtraining/videos/2639452556084492/

ยกตัวอย่าง กำแพง
หลักการใช้ Dictionary เก็บ Id กับ location แล้วเอา location มาเทียบ ถ้าต่าง แสดงว่า Move
ถ้า Id ไม่มี แสดง ว่า ลบออก กรณีเพิ่ม จะเป็น Id ใหม่ ให้ Array ของ Id ใหม่มา loop check ว่าไม่มี ก็จะ เป็น New Id


     public static void compare2file(ExternalCommandData cmd)
        {
            UIApplication uiapp = cmd.Application;
            UIDocument uidoc = uiapp.ActiveUIDocument;
            Autodesk.Revit.ApplicationServices.Application app = uiapp.Application;
            Autodesk.Revit.DB.Document doc = uidoc.Document;
            Dictionary<ElementId,string> id1 = new Dictionary<ElementId, string>(); // file 1
            Dictionary<ElementId, string> id2 = new Dictionary<ElementId, string>(); // file 2
            bool firstFile = true;
            foreach (Document auDoc in uiapp.Application.Documents)
            {
                Dictionary<ElementId, string> ids = firstFile ? id1 : id2;
                // to next
                firstFile = false; 
                MessageBox.Show(auDoc.PathName);
                // filter for wall
                FilteredElementCollector collLinked =  new FilteredElementCollector(auDoc);
                IList<Element> linkedWalls =
                  collLinked.OfClass(typeof(Wall)).ToElements();
                //  MessageBox.Show("Wall count=" + linkedWalls.Count.ToString());
                foreach (Element e in linkedWalls)
                {
                    Wall awall = e as Wall;
                    Curve c1 = (awall.Location as LocationCurve).Curve;
                    XYZ p1=c1.GetEndPoint(0);
                    XYZ p2 = c1.GetEndPoint(1);
                    string locationS = p1.X.ToString("0.##") + "," + p1.Y.ToString("0.##")+"," + p1.Z.ToString("0.##") +
                      "|"+   p2.X.ToString("0.##") + "," + p2.Y.ToString("0.##") +","+ p2.Z.ToString("0.##");
                    // MessageBox.Show("id=" + e.Id.ToString() + " " + locationS);
                    ids.Add(e.Id, locationS);
                }
            } // foreach doc
            foreach (var item1 in id1)
            { //compare
                string s1 = item1.Value;
                if (id2.ContainsKey(item1.Key))
                {  // check if id2 have same id
                    string s2 = id2[item1.Key];
                    if (s1 != s2) MessageBox.Show("Move id=" + item1.Key.ToString());
                }
                else { MessageBox.Show("Erase id=" + item1.Key.ToString()); }
            }
            foreach (var item2 in id2)
            {// just more id show
                if (!id1.ContainsKey(item2.Key))
                {
                    MessageBox.Show("New Id=" + item2.Key.ToString());
                }
            }

        }