วันจันทร์ที่ 17 ธันวาคม พ.ศ. 2555

สร้างเสาเป็น Element แรกใน Revit

เพื่อเป็นกำลังใจในการเริ่มเขียนโปรแกรมใน Revit
ก็จะเริ่มจากการเขียน เสา ไปใน Revit โดยง่ายที่สุด (แต่ก็เอาเรื่องเหมือนกัน)
วิธีการ จะต้องเข้าใจก่อนว่า เราต้องมี Family ก็ไปทำการ Load Family จาก Library ของ Revit ใน Project มาก่อน จากนั้น ใน โปรแกรม ก็จะคิดว่าเราได้ นำ Family ต่างๆ และกำหนด Type ต่างๆ มาแล้ว

เริ่มจาก 
1. เริ่มเปิด Document ก่อน และต้องเปิด Trasaction (เป็นระบบเดียวกับ ฐานข้อมูลที่เราสามารถยกเลิกได้ โดยไม่ทำให้โปรแกรม หรือข้อมูลเสียหาย)

Autodesk.Revit.DB.Document document = commandData.Application.ActiveUIDocument.Document;


FilteredElementCollector collector = new FilteredElementCollector(document);
 Transaction tr = new Transaction(CachedDoc);

          if (TransactionStatus.Started == tr.Start("Create Columns"))
          {.. ที่ต้องการทำ ..

          tr.Commit();  // ปิด transaction และ update revit
       }



2. ใส่ส่วน "ที่ต้องการทำ" ทำการ กรองเฉพาะ Family ที่ต้องการโดยเลือกจากCatalog -> Structure Columns


Collection<Element> fmList = collector.OfClass(typeof(FamilySymbol)).ToElements();
 var query = from fm1 in fmList where ((FamilySymbol)fm1).Category.Name == "Structural Columns" select (FamilySymbol)fm1;
    List<FamilySymbol> oFmList = query.ToList<FamilySymbol>();

จะเห็นได้ว่ามีความแตกต่างจาก บทความก่อนหน้านี้นะครับ ผมใช้ Linq ในการกรองข้อมูลซึ่งเท่ากับ การใช้ Foreach เกือบ 10 บรรทัด โดยกรองเฉพาะ "Structural Columns" ใส่ใน oFmList

ตอนนี้เราจะมี Family ที่เป็น Array เพื่อเลือกใช้งาน แล้ว

3.ทำการวาด ได้แก่ การกำหนด ElementSet และ กำหนด ตำแหน่ง แล้วสร้าง Instance หรือวาง
สำหรับการสร้าง จะมีการกำหนดเมื่อมีการสร้าง Element ว่าต้องเป็น StructuralType.Column ส่วนนี้บังคับ จะต้องมีหมวด ตาม Revit กำหนดซึ่งมาจาก IFC Standard(ระบบมาตรฐานของ Bim) 

ElementSet elementSet = null;
for (int i = 1; i < 7; i++)
            {
            int k = i % oFmList.Count;
            FamilySymbol sFm = oFmList[k];

                  XYZ location = new XYZ(i * 10, 100, 0);
                  FamilyInstanceCreationData fiCreationData = new FamilyInstanceCreationData(location, sFm, level,
                              Autodesk.Revit.DB.Structure.StructuralType.Column);
                  if (null != fiCreationData)
                  {
                        fiCreationDatas.Add(fiCreationData);
                  }
            }
           
if (fiCreationDatas.Count > 0)
  {     
   elementSet = document.Create.NewFamilyInstances(fiCreationDatas);
  }

เมื่อ Compile แล้วทดสอบ ก็จะวาง เสาตาม Family และ Type ต่างๆตามในรูป









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

  1. public static Element FindElementByName(
    Document doc,
    Type targetType,
    string targetName)
    {
    return new FilteredElementCollector(doc)
    .OfClass(targetType)
    .FirstOrDefault(
    e => e.Name.Equals(targetName));
    }

    ตอบลบ