วันศุกร์ที่ 28 สิงหาคม พ.ศ. 2558

การใช้ Revit Project Parameter สำหรับTrack Object ใน โครงการ

ในการทำงาน โครงการ ในหลายกรณี จำเป็นต้องมีการใส่ Track ลงในวัตถุ ของ Revit  เพื่อ ใช้ในการประมาณราคา การ Track time-line ก่อสร้าง เช่น เสา คาน พื้นเป็นต้น
การสร้าง Parameter ทำได้ไม่ยาก ไปที่

Manage->Project Parameters


โดยที่ Parameter จะมี2 ชนิด คือ Project Parameter กับ Share Parameter  , Project Param. จะอยู่เฉพาะ โครงการ, Share Param. จะ Save และส่งไปยังโครงการหรือ เครื่องอื่นได้
Parameter จะแสดง ใน 2 แบบ คือ Type กับ Instance , Type จะแสดงที่ตัว Family เอง เช่นเลือก เสา จะมี Parameter แสดงที่ Family นั้นๆ ทุกตัวที่ Family นี้วางไปมีค่า common เดียวกัน, Instance จะเป็นค่าที่เฉพาะตัวแต่ละ Element ที่วางไป จะแสดงใน Property

ในภาพแสดง Data ที่เป็น Project Parameter แบบ instance ที่จะใส่ได้ตาม แต่ละ Element เช่น ในเสา
ในบทความต่อไปจะเป็น การนำมาใช้งาน ในโดยการเรียกค่า Param  ในแต่ละ Element มาแสดงผล


การเปิด Element ใน Revit 2016 Api เปลี่ยนแปลง จาก 2014

ใน Revit2016 Api มีการเปลี่ยน การ access ไปยัง Element โดยจะไม่มีการให้การ Access ไปยัง Element ใด โดยตรง เช่น จาก Document จะเรียก Level ก็จะไม่ได้ แต่จะได้ Level element id แทน และ การ Pick Object ก็จะได้ Element Id จากเดิม สามารถเรียก Element ได้โดยตรง
โดย API เดิม ยกเลิก โดยสมบูรณ์ ใน 2016  ข้อดีคือ เขียนโปรแกรมเป็นระบบเดียวกันทั้งหมด
การ ปิด Element จึงต้องเปิดจาก Element Id

     Reference pickedObj = commandData.Application.ActiveUIDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element, "Please select an element to move.");


     using (Transaction trans = new Transaction(doc, "ERead"))
            {
                // เริ่ม transaction
                trans.Start();
               // open entity
                Element ent = doc.GetElement(pickedObj.ElementId);
        // code here        
              
                trans.Commit(); // Ok
            }

กรณีที่เป็น Level  หรือ อื่นๆ จะใช้ Cast  (as  xxx) เพื่อเปลี่ยนเป็น Class Object ที่ต้องการ



 Level emlv =  doc.GetElement(e1.LevelId) as Level;


วันพุธที่ 3 มิถุนายน พ.ศ. 2558

การตัดกำแพง wall เพื่อการแบ่งแผ่น Precast concrete

กำแพงเป็นวัตถุพื้นฐานในการวาดของโปรแกรมสามมิติ Revit สำหรับการใช้งานเราจำเป็นต้อง กำแพงเป็นชิ้นเล็กๆเพื่อสะดวกต่อการขนย้ายเนื่องจากรถและเครนที่ขนมีน้ำหนักบรรทุกจำกัด กำแพงเมื่อมีการแบ่งจะไม่ใช้คำสั่งในการแบ่งจริงๆแต่จะใช้วิธีการสร้างกำแพงใหม่ที่มีความยาวตามที่ระยะระยะแบ่งโดยนำคุณสมบัติจากกำแพงเดิมเช่นความสูงความหนาวัสดุมาใส่ในกำแพงที่สร้างใหม่ กำแพงใหม่ถูกสร้างเสร็จแล้วก็แพงเดิมก็จะถูกลบไป

ตัวอย่างการสร้างกำแพง 
http://spiderinnet.typepad.com/blog/2013/04/revit-net-creation-apis-create-straight-and-curved-walls.html

ในบทต่อไป จะเป็นเรื่อง API ของการเจาะร่องเพื่อยาปูน สำหรับต่อแผ่น Precast



วันอาทิตย์ที่ 31 พฤษภาคม พ.ศ. 2558

ปิด Quick Properites และ Selection Cycling ใน Autocad

เป็นเรื่องน่ารำคาญ สำหรับผู้ใช้งานที่ชำนาญ เวลากด Mouse ที่เส้น แล้ว Autocad ใหม่ จะขึ้น ตัวเลือก แยะไปหมด คือ Quick Properties และ Selection Cycling ว่าจะเลือกเส้นใหน

ให้เรียกคำสั่ง DSettings และ หรือเลือก Mouse ขวาที่ Osnap ด้านล่างของจอก็ได้

แล้ว เลือก ที่ Quick Properties และ Selection Cycling


การออกแบบ Precast Concrete กับ Revit Program

การออกแบบก่อสร้าง ด้วยระบบ Precast Concrete เป็นที่นิยมมากต่อเนื่องมา 10 ปี และ หลายบริษัท ชั้นนำในประเทศไทย ก็นำระบบนี้มาใช้งาน ประสพความสำเร็จเป็นส่วนมาก เนื่องจาก เป็นระบบที่ให้ความแข็งแรง และ ราคาต้นทุนถูกเมื่อเที่ยบกับการก่อสร้างหน้างาน แบบเดิม โดยประมาณ ค่าก่อสร้าง จะลดลงไปถึง 50% และเวลาในการก่อสร้าง ก็เร็วขึ้น ในระบบก่อสร้างที่เป็นรูปแบบโรงงาน สามารถ ผลิตบ้าน นำไปประกอบได้ วันละ 1 หลัง เป็นเรื่องปรกติ

การก่อสร้าง อาคารด้วย Precast มี 6 ขั้นตอน ได้แก่ การ ออกแบบ อาคารให้เหมาะกับ Precast , การแบ่ง ชิ้นงาน ให้เหมาะสมกับการก่อสร้าง, การทำแบบหล่อ และ หล่อชิ้นงาน, เตรียมพื้นที่ฐานราก, การขนส่งและติดตั้ง และ สุดท้ายการตกแต่งให้สวยงาม


การออกแบบ Precast เป็นเรื่องที่ใช้หลักการไม่ซับซ้อน แต่ต้องอาศัย Engineering Sense และความปราณีต ในการออกแบบ ทำแบบหล่อ  และความเป็นไปได้ในการประกอบที่หน้างานด้วย โดยเฉพาะ ขนาดและน้ำหนักของ เครน  งานรายละเอียดของเหล็กเสริมใน ชิ้นงาน Precast ปัจจุบัน บริษัทรับช่วงการผลิต ต่างมีความสามารถ ทำตามความต้องการได้และมีคุณภาพสูง(ปูนซิเมนต์ไทยลงมาทำโรงงานรับหล่อด้วยเทคโนโลยี่สูง ราคาไม่แพงเพราะวัสดุเขาเอง)

กลับมาการออกแบบจึงเป็นเรื่องสำคัญ เนื่องจากถ้า Detail ครบ ปัญหาจะน้อยลง ในการแก้ปัญหาหน้างาน เช่นการเจาะผนัง หรือ ตัดพื้น เป็นเรื่องยากมาก เนื่องจาก ซีเมนต์ที่ใช้ทำ Precast มีความแข็งมาก ( ปรกติ หล่อหน้างาน ประมาณ 180, ถ้าเป็น Precast ประมาณ 300) ทำด้วยเครื่องมือปรกติไม่ได้ ความถูกต้องในการติดตั้ง ชิ้นส่วนต่างๆจึงต้องพอดี

จุดประสงค์ เพื่อการสร้างโปรแกรมจากแบบสถาปัตย์ ไปเป็น แบบ ที่ส่งต่อไปทำ Precast ที่โรงงาน
โปรแกรม Revit เป็นโปรแกรมยอดนิยมในการออกแบบอาคาร 3มิติ และ มี API ในการเขียนโปรแกรมเพิ่มเติม ด้วย ภาษาชั้นสูง เช่น C#  โดยเมื่อพิจารณาจาก โครงสร้างโปรแกรม จะพบว่า มี 3 ส่วน ได้แก่ Modeler สำหรับขึ้นรูป Mass  , Assembly เป็นการวาง Object รวมเป็นอาคาร และ Family สำหรับ Object ที่จะกลายเป็น Precast ต่อไป
ในบทความต่อไป จะเป็นเรื่อง Component ต่างๆของโปรแกรม

Reference
มาตราฐานระบบPrecast Hongkong ปี 2003

วันอังคารที่ 19 พฤษภาคม พ.ศ. 2558

เชื่อม Geometry ชอง NanoCAD(Autocad Clone) กับ Alibre (Geomagic) 3D Cad

เป็นปัญหามานาน ระหว่าง 3D Parametric CAD เช่น Alibre (พวกเดียวกับ Inventor,solidwork) ในการนำเข้า รูปที่ส่งมาเป็น 2 มิติ จาก Autocad ในนี้ ให้พัฒนาโปรแกรมบน Dotnet และ ทำการเชื่อม Automation ไปที่Alibre โดยให้สร้างSketch จาก พิกัด 2D Cad ที่น่ามึนก็คือ เรื่องโค้ง Bulge ของ Polyline ซึ่งต้องกลับไปอ่านสมการ


ของ Bulge ต้องขอบคุณ Website
http://www.afralisp.net/archive/lisp/Bulges1.htm

Bulge = tan(Q/4)
จุด P3 = (VecP2->P1+Vecฉากของ VecP2->P1)/2*bulge

วันเสาร์ที่ 20 ธันวาคม พ.ศ. 2557

สร้าง พื้น FLOOR ใน Revit

การสร้างพื้น จะซับซ้อน นิดหนึ่ง เนื่องจาก Floor เป็น System Family โดยที่ต้องมี Boundary จึงจะสร้าง ได้
ใน Code เป็นตัวอย่างการสร้าง พื้น8เหลี่ยม จะมีการสร้าง profile ก่อน  แล้วจึงเลือก พื้น

 public static void BatchCreateFloor(XYZ pt, Autodesk.Revit.DB.Document doc, Level level)
        { // ค้นเฉพาะพื้น
            List<FloorType> fl = listFloor(doc);
            int floorsides=8;// แปดเหลี่ยม
             CurveArray profile = new CurveArray();
            XYZ location=pt;
            double floorradius=m2f(5);// รัศมี 5 เมตร
        for (int i = 0; i < floorsides; i++)
        {
            double curAngle = i * Math.PI / floorsides * 2;
            double nextAngle = (i < floorsides - 1 ? i + 1 : 0) * Math.PI / floorsides * 2;

            XYZ curVertex = new XYZ(location.X + floorradius * Math.Cos(curAngle), location.Y + floorradius * Math.Sin(curAngle), location.Z);
            XYZ nextVertex = new XYZ(location.X + floorradius * Math.Cos(nextAngle), location.Y + floorradius * Math.Sin(nextAngle), location.Z);
            Line line =  Line.CreateBound(curVertex,nextVertex);
              
            profile.Append(line);
        }
            // เลือก
            Autodesk.Revit.Creation.Document creation_doc = doc.Create;
            // เอาตัวแรกมาวาด         
            creation_doc.NewFloor(profile, fl[0],level,true);
        }
        static List<FloorType> listFloor(Autodesk.Revit.DB.Document doc)
        {
            List<FloorType> m_FlTypeCollection = new List<FloorType>();

            FilteredElementCollector filteredElementCollector = new FilteredElementCollector(doc);
            filteredElementCollector.OfClass(typeof(FloorType));// กรองเฉพาะ พื้น
            m_FlTypeCollection = filteredElementCollector.Cast<FloorType>().ToList<FloorType>();

            return m_FlTypeCollection;
        }