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

การแสดงค่า ใน List Box ใช้Dictionary เป็น Datasource

การใช้ ListBox Datasource เพื่อความง่ายใช้ Dictionary ในการเลือก TitleBox สำหรับ Sheet ใน Revit


FilteredElementCollector collector = new FilteredElementCollector(doc);
                collector.OfCategory(BuiltInCategory.OST_TitleBlocks);
                collector.WhereElementIsElementType();

                //Get ElementId of first title block type.

Dictionary<string,ElementId> datas = 
collection.AsEnumerable().ToDictionary(x=>x.ToString(),y=>y);

listBox1.DataSource = new BindingSource(datas, null); 
listBox1.DisplayMember = "Value"; 
listBox1.ValueMember = "Key"; 

เมื่อเลือก ที่ Selection 
จะเป็น SelectedValue แต่ต้อง ใช้ เป็น 

ElementId id =SelectedValue as ElementId;

วันจันทร์ที่ 27 พฤศจิกายน พ.ศ. 2560

การจับเวลาใน การทำงาน คำนวนหรือ ทดสอบอัลกอริกทึม

ปัญหาของการทำงาน Data ขนาดใหญ่ อาจจะเกิด ปัญหา ของ การคำนวน ใช้เวลา แบบ 2ยกกำลัง n ตามจำนวน Data ได้ บางครั้ง เพื่อต้องการ ทดสอบจับเวลา ใช้ DateTime และ TimeSpan ใน Dotnet

ในกรณีดูเวลา ใช้ เวลาวินาทีของ วัน(เราคงไม่ทำข้ามวัน)


   logMsg("End at:"+DateTime.Now.TimeOfDay.TotalSeconds.ToString("0.##"));

กรณี ดู เริ่มและสิ้นสุด

 // start timer
            DateTime sttime = DateTime.Now;
            doComputingHere();
            DateTime endTime = DateTime.Now;
            string diff = ((endTime - sttime).TotalSeconds).ToString("0.##");
            logMsg("Run time(s):" + diff);

วันอาทิตย์ที่ 12 พฤศจิกายน พ.ศ. 2560

Revit เลือกวัตถุ 2 ครั้ง PickObject

ทดลอง Print Id ของ Object ที่เลือก 2 ครั้ง ใช้ PickObject แต่ uiDoc.Selection  -> ตัวแปร r ใน วงเล็บ จะเป็นคนละตัว

public static void test2Pick(ExternalCommandData commandData)
        {
            UIApplication uiApp = commandData.Application;
            UIDocument uiDoc = uiApp.ActiveUIDocument;
            var app = uiApp.Application;
            Document doc = uiDoc.Document;
            ElementId id1=null;
            ElementId id2=null;

            string str = "2 Id=";
            // Select something to use as base bounding box.
            {
                Reference r = uiDoc.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element);
                id1 = r.ElementId;
                str += id1.ToString()+"\n";
            }
            {
                Reference r = uiDoc.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element);
                id2 = r.ElementId;
                str += id2.ToString();
            }
            MessageBox.Show(str);

        }

แสดง Family ทั้งหมดใน Project File

เป็นการใช้ FilteredElementCollector .OfClass จะค้นอะไรให้ทำตรงนี้

  public static void listAllFamilies(ExternalCommandData cmd)
        {
 UIApplication uiapp = cmd.Application;
            UIDocument uidoc = uiapp.ActiveUIDocument;
            Autodesk.Revit.ApplicationServices.Application app = uiapp.Application;
            Autodesk.Revit.DB.Document doc = uidoc.Document;

            FilteredElementCollector collector = new FilteredElementCollector(doc).OfClass(typeof(Family));
            string str = "";
            foreach (var item in collector)
            {

                str+=item.Name+"\n";

            }
            TaskDialog.Show("??",str);

        }

วันอาทิตย์ที่ 1 ตุลาคม พ.ศ. 2560

หาพิกัดของDuct หรือ ท่อ

Duct และ ท่อ เป็น Element ใน MEP การหาจุดเริ่มต้นและสิ้นสุด ต้องทำให้เป็น Curve ก่อน

  public static void getDuctPoint(ExternalCommandData commandData)
        {
                UIApplication uiapp = commandData.Application;
                UIDocument uidoc = uiapp.ActiveUIDocument;
                Document doc = uidoc.Document;
                string dbg = "";
                FilteredElementCollector allDuct
                  = new FilteredElementCollector(doc)
                    .OfClass(typeof(Duct));

                int nDucts = 0;
                int nCurves = 0;

                foreach (Duct aDuct in allDuct)
                {
                    ++nDucts;

                    LocationCurve lc = aDuct.Location as LocationCurve;

                    if(null == lc) dbg= "No Duct!";

                    if (null != lc)
                    {
                        ++nCurves;

                        Curve c = lc.Curve;

                       dbg+=string.Format("Duct {0} from {1} to {2}",
                          aDuct.Id.IntegerValue,
                          c.GetEndPoint(0).ToString(),
                          c.GetEndPoint(1).ToString());
                    }
                }
                TaskDialog.Show("??", dbg);
                //return Result.Succeeded;

         }

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

ระยะสั้นที่สุด ระหว่าง Line

เป็น การคำนวน ด้วยวิธี Vector หาระยะสั้นที่สุดระหว่าง Line

 public static double dist3D_Line_to_Line(Line L1, Line L2)
        {
            XYZ u = L1.GetEndPoint(1) - L1.GetEndPoint(0);
            XYZ v = L2.GetEndPoint(1) - L2.GetEndPoint(0);
            XYZ w = L1.GetEndPoint(0) - L2.GetEndPoint(0);
           
            double a = u.DotProduct( u);         // always >= 0
            double b = u.DotProduct(v);
            double c = v.DotProduct( v);         // always >= 0
            double d = u.DotProduct( w);
            double e = v.DotProduct( w);
            double D = a * c - b * b;        // always >= 0
            double sc=0;
           double tc=0;
            double SMALL_NUM = 0.000001;
            // compute the line parameters of the two closest points
            if (D < SMALL_NUM)
            {          // the lines are almost parallel
                sc = 0.0;
                tc = (b > c ? d / b : e / c);    // use the largest denominator
            }
            else
            {
                sc = (b * e - c * d) / D;
                tc = (a * e - b * d) / D;
            }

            // get the difference of the two closest points
            XYZ dP = w + (sc * u) - (tc * v);  // =  L1(sc) - L2(tc)

            return dP.GetLength();   // return the closest distance

        }

สร้าง Sheet ด้วย List ใน Revit

สร้าง Sheet ใน Revit ด้วย List ดูใน datas


  public static void createSheetList(ExternalCommandData cmd)
        {
            UIApplication uiapp = cmd.Application;
            UIDocument uidoc = uiapp.ActiveUIDocument;
            Autodesk.Revit.ApplicationServices.Application app = uiapp.Application;
            Autodesk.Revit.DB.Document doc = uidoc.Document;
            string[] datas = {"1,sheet1","2,sheet2","3,sheet3" };
            
            
                FilteredElementCollector collector = new FilteredElementCollector(doc);
                collector.OfCategory(BuiltInCategory.OST_TitleBlocks);
                collector.WhereElementIsElementType();
                //Get ElementId of first title block type.
                ElementId titleBlockId = collector.FirstElementId();
              using(  Transaction t = new Transaction(doc, "Create Sheets"))
              {
                t.Start();
                foreach(string csvLine in datas)
                {
                    char[] separator = new char[] { ',' };
                    string[] values = csvLine.Split(separator, StringSplitOptions.None);
                    // Make sure both values are valid
                    if (values[0] != null && values[0].Length > 0 && values[1] != null && values[1].Length > 0)
                    {
                        ViewSheet sheet = ViewSheet.Create(doc, titleBlockId);
                        sheet.Name = values[1];
                        sheet.SheetNumber = values[0];
                    }
                }
                t.Commit();
              }

         }