วันเสาร์ที่ 20 กันยายน พ.ศ. 2557

คำสั่งพัฒนาโปรแกรม DDD ใน Revit

คำสั่ง พัฒนาโปรแกรม Rapid SDK ใน Revit
Download Here
copy ไปที่  c:\
และ แตกไฟล์ จะได้ Folder Turbostruct
และ ต้อง ลง Addin manager
และทำการ Load
การเรียกคำสั่งให้เรียกที่ External command หรือ รูป Icon DDD

ตัวอย่าง Code สำหร้บ Revit 2014

ตัวอย่าง Code สำหรับ Revit 2015

เรื่องของ Create

ในโปรแกรจะเป็น การ CreateColumn
จะมี Sub Method หรือโปรแกรมย่อย 4 โปรแกรม
1. FindElement ใว้สำหรับ ค้น Element ช่น เสา คานพื้น ชั้น ห้อง ที่อยู่ ใน Revit Project
2. getAllType เป็นการ นำ FamilySymbol ที่กำลังใช้งานอยู่ ใน Project เช่น เสาทั้งหมด มาใส่ Array ที่เป็น List
3.BatchCreateColumns เป็นการสร้าง Instant หรือวาง วัตถุ ลงไป ใน view โดยต้องกำหนด จุด XYZ
   สำหรับ transaction จะควบคุมที่ CreateColumn

สำหรับ การ Edit หรือ แก้ไข
ตัวอย่าง ในการ เลือกและ Move
ตัวอย่าง

สำหรับการเลือก และดึงข้อมูลโดยใช้การเลือก ก่อนแล้วเรียกคำสั่ง
ตัวอย่าง

สำหรับ Revit 2015 
Addin ไม่สามารถ Load ได้ ให้วางตรงๆ ใน Folder
C:\Users\<user>\AppData\Roaming\Autodesk\Revit\Addins\2015
file Addin ชอง DDD
และ Api จะเปลี่ยน หลายตัวโดยเฉพาะ Create ต่างๆ ที่เคยเป็น Method ใต้ Document จะเปลี่ยนไป
อยู่ใน Symbol นั้นๆ เช่น doc.newCreateLine เปลี่ยนเป็น Line.Create แทน ลองเดาดู หรือดูจาก SDK ของ Revit 2015  แต่จะเป็นระบบ และง่ายขึ้น

ผลของโปรแกรมตัวอย่าง


สำหรับ หัวของไฟล์ ใน c#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using System.Windows.Forms;
using Autodesk.Revit.Creation;
using Autodesk.Revit.DB.Structure;

ข้อสำคัญอีกอย่าง คือ Revit ตำแหน่ง XYZ จะเป็นหน่วย ฟุต ไม่ใช่ เมตร ถ้าต้องเปลี่ยน ให้ หารด้วย
0.3048
public static double f2m(double f)
{
   return f*0.3048;
}
public static double m2f(double m)
{
   return f/0.3048;
}

// text file ของ ExternalTool1.addin

<?xml version="1.0" encoding="utf-8"?>
<RevitAddIns>
  <AddIn Type="Application">
    <Name>External Tool</Name>
    <Assembly>C:\turboStruct\DDDRevit.dll</Assembly>
    <ClientId>3beb63b3-38f8-464b-a301-c30d239a69f6</ClientId>
    <FullClassName>PowerAEC.PPToolbar</FullClassName>
    <VendorId>ADSK</VendorId>
    <VendorDescription>Autodesk, www.autodesk.com</VendorDescription>
  </AddIn>
  <AddIn Type="Command">
    <Assembly>C:\turboStruct\DDDRevit.dll</Assembly>
    <ClientId>54538ab4-83a1-4a5b-b172-1ffaa776b777</ClientId>
    <FullClassName>PowerAEC.Command</FullClassName>
    <Text>Command</Text>
    <Description>""</Description>
    <VisibilityMode>AlwaysVisible</VisibilityMode>
    <VendorId>ADSK</VendorId>
    <VendorDescription>Autodesk, www.autodesk.com</VendorDescription>
  </AddIn>
  <AddIn Type="Command">
    <Assembly>C:\turboStruct\DDDRevit.dll</Assembly>
    <ClientId>fb306864-2f47-427d-997f-68a17d625d06</ClientId>
    <FullClassName>PowerAEC.showBook</FullClassName>
    <Text>showBook</Text>
    <Description>""</Description>
    <VisibilityMode>AlwaysVisible</VisibilityMode>
    <VendorId>ADSK</VendorId>
    <VendorDescription>Autodesk, www.autodesk.com</VendorDescription>
  </AddIn>
</RevitAddIns>


หมายเหตุ กรณี Error เมื่อเรียกใช้ DDD
 error CS0012: The type 'System.Attribute' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
ต้องเพิ่มใน Source code ตรงหัวโปรแกรม
using System;
using System.Collections;
using System.Collections.Generic;

//css_reference "System.Runtime"

5 ความคิดเห็น:

  1. ตัวอย่างใหม่ จะรวมมีทั้ง 2 คำสั่ง และ จะสร้าง ทั้ง คาน กำแพง พื้น

    http://goo.gl/Ba9tvP

    ตอบลบ
  2. การบ้าน ให้เอา จุด Polyline มาวาดเป็น กำแพง และ ใส่ เสา คานให้เรียบร้อย

    ตอบลบ
  3. เริ่มต้น โปรแกรม

    UIApplication uiapp = commandData.Application;
    UIDocument uidoc = uiapp.ActiveUIDocument;
    Autodesk.Revit.ApplicationServices.Application app = uiapp.Application;
    Autodesk.Revit.DB.Document doc = uidoc.Document;

    ตอบลบ
  4. public class RevitW1
    {
    public static void myHello(ExternalCommandData cmd)
    {
    MessageBox.Show("OK Interface");
    }
    public static void updateDesc(ExternalCommandData cmd)
    {
    UIApplication uiapp = cmd.Application;
    UIDocument uidoc = uiapp.ActiveUIDocument;
    Autodesk.Revit.ApplicationServices.Application app = uiapp.Application;
    Autodesk.Revit.DB.Document doc = uidoc.Document;
    Reference aEle=uidoc.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element);
    updateAParam(aEle.ElementId, "Comments", "Test",doc);

    }

    private static void updateAParam(ElementId elementId, string v1, string v2, Document doc)
    {
    using (Transaction tran = new Transaction(doc))
    {
    tran.Start("update description");
    try
    {
    Element aElem = doc.GetElement(elementId);
    Parameter acom = aElem.GetParameters(v1).First();
    acom.Set(v2);
    tran.Commit();
    }
    catch
    {
    tran.RollBack();
    }
    }
    }

    public static void selectAllData(ExternalCommandData cmd)
    {
    UIApplication uiapp = cmd.Application;
    UIDocument uidoc = uiapp.ActiveUIDocument;
    Autodesk.Revit.ApplicationServices.Application app = uiapp.Application;
    Autodesk.Revit.DB.Document doc = uidoc.Document;
    IList pickItems= uidoc.Selection.PickObjects(
    Autodesk.Revit.UI.Selection.ObjectType.Element);
    // TaskDialog.Show("pickitems", pickItems.Count.ToString());
    // test form data
    FormElement myForm = new FormElement();
    // string showMsg = "";
    foreach (Reference item in pickItems)
    {
    Element aElm = doc.GetElement(item.ElementId);
    string stype=aElm.GetType().ToString();
    // showMsg += "\n" +stype;
    string cat = aElm.Category.Name;
    // showMsg += "\n"+cat;
    string eName = aElm.Name;
    // showMsg += "\n" + eName;
    myForm.listBox1.Items.Add(stype + " " + cat + " " + eName+"|"+item.ElementId.ToString());

    if (cat == "Walls")
    {
    IList pars= aElm.GetParameters("Area");
    if (pars.Count > 0)
    {
    string area = pars[0].AsValueString();
    double dArea = pars[0].AsDouble();
    myForm.listBox1.Items.Add("Area=" + area);
    // showMsg += "\n area=" + area +","+dArea.ToString();
    }
    // type parameter
    ElementId typeId = aElm.GetTypeId();
    Element etype = doc.GetElement(typeId);
    IList pars2 = etype.GetParameters("Width");
    if (pars2.Count > 0)
    {
    string width = pars2[0].AsValueString();
    myForm.listBox1.Items.Add("W=" + width);
    }

    }
    } // foreach
    DialogResult dr;
    do
    {
    dr = myForm.ShowDialog();
    if (dr == DialogResult.Retry)
    {
    int eeid = Convert.ToInt32(myForm.label1.Text);
    ElementId updId = new ElementId(eeid);
    updateAParam(updId, "Comments", "A Data", doc);
    }
    } while (dr != DialogResult.Cancel);

    }
    }
    }

    ตอบลบ