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

การใช้ PickPoint ใน Revit

ในการเลือกจุด ใน Revit  มี 2 แบบ ได้แก่ การเลือก (pt) จากจุดใดๆ

XYZ pt = _uiDoc.Selection.PickPoint( "Pick a point" );

การเลือกจะ ให้เลือกบนจอ และมี Prompt แสดง
อีกแบบที่จะใช้ใน Application บ่อยๆ ได้แก่ การเลือกบน Object เช่น กำแพง

Reference r = _uiDoc.Selection.PickObject(
        ObjectType.PointOnElement,
        "Select a point on element" );

      Element e = _uiDoc.Document.GetElement( r );
      XYZ pt = r.GlobalPoint;

      

ตัวอย่างข้างล่างเป็นการ Moveวัตถุ โดยการเลือก และคำนวนการย้ายตำแหน่งจาก Object โดยใช้ BoundingBox(กล่องสี่เหลี่ยมครอบวัตถุ)

public static void SelectAndMoveElement(ExternalCommandData commandData)
{// เป็นการทดลองการแก้ไข ตำแหน่งของ Object
// เลือก Project ปัจจุบัน
Autodesk.Revit.DB.Document CachedDoc = commandData.Application.ActiveUIDocument.Document;
Autodesk.Revit.ApplicationServices.Application CachedApp = commandData.Application.Application;
// เลือก วัตถุ 1 ชิ้น
Reference pickedObj = commandData.Application.ActiveUIDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element, "Please select an element to move.");

if (pickedObj != null && pickedObj.ElementId != ElementId.InvalidElementId)
{
// element location
                Element e1 = CachedDoc.GetElement(pickedObj.ElementId);
                XYZ minPt1 = e1.get_BoundingBox(null).Min;
                XYZ minPt2 = e1.get_BoundingBox(null).Max;
                XYZ minPt = minPt1 + (minPt2 - minPt1) / 2;// หา จุดกึ่งกลางวัตถุ
                XYZ mPt = commandData.Application.ActiveUIDocument.Selection.PickPoint();
                XYZ vPt = mPt - minPt;// คำนวน Vector Move
                
                PPGenInput.PPSingleInput mydlg = new PPGenInput.PPSingleInput();
// เลือกระยะเป็น Vector
mydlg.setPrompt("Enter Move Vector:");
mydlg.text = vPt.ToString();//"10,10,0";
            
mydlg.ShowDialog();
string vectorStr = mydlg.text.Replace("(","").Replace(")",""); // นำค่าเข้ามาที่ ตัวแปร

string[] arr = vectorStr.Split(new char[] { ',' }); // แยกเป็นตัวๆ X,Y,Z
using (Transaction trans = new Transaction(CachedDoc, "SelectAndMoveElement"))
{
// เริ่ม transaction
trans.Start();
#if R14    
Line lineAsAxis = CachedApp.Create.NewLineBound(new XYZ(0, 0, 0), new XYZ(0, 0, 1));
#else
      //              Line lineAsAxis = CachedApp.Create.(new XYZ(0, 0, 0), new XYZ(0, 0, 1));

#endif
                   
                    // แปลงจาก arr เป็น vector จริง double_x,double_y,double_z
XYZ xyz = ptM2f(double.Parse(arr[0]), double.Parse(arr[1]), double.Parse(arr[2]));
// move
ElementTransformUtils.MoveElement(CachedDoc, pickedObj.ElementId, xyz);
                   
trans.Commit(); // Ok
}
}

}

วันอาทิตย์ที่ 7 ธันวาคม พ.ศ. 2557

การวาง Opening เช่นประตูหน้าต่าง ต้องบอก Host เช่นกำแพง

กรณีที่ต้องการวาง ช่องเปิด เช่นประตู หน้าต่างใน Revit ต้องบอก Host หรือ เจ้าของด้วย ที่เป็น Wall

ตัวอย่าง

public static void BatchCreateDoor(XYZ pt, Autodesk.Revit.DB.Document doc,Wall w1, Level level)
        { // ค้นประตู ต้องสร้างหลัง กำแพง
            List<FamilySymbol> fl = getAllType("Doors", doc);

        
            Autodesk.Revit.Creation.Document creation_doc = doc.Create;

            StructuralType st = StructuralType.NonStructural;
            // เอาตัวแรกมาวาด
          
            creation_doc.NewFamilyInstance(pt, fl[0],w1, st);

        }

การวาง Object ใน Revit ที่ไม่ใช่ Structure เช่น เฟอร์นิเจอร์

ต้องบอกว่า ไม่ใช่ Structure

StructureType.NonStructure

ตัวอย่าง code

 public static void BatchCreateFurniture(XYZ pt, Autodesk.Revit.DB.Document doc, Level level)
        { // ค้น Furniture
            List<FamilySymbol> fl = getAllType("Furniture", doc);

            // 
            Autodesk.Revit.Creation.Document creation_doc = doc.Create;

            StructuralType st = StructuralType.NonStructural;
           // ทดลอง เอาตัวแรก
           creation_doc.NewFamilyInstance(pt, fl[0], st);
        }

กรณีที่ต้องการหมุน
ให้เพิ่มที่ NewFamilyInstance(pt,fl[0],new XYZ(1,1,0),st);
จะหมุน ไป 45 องศา เพราะ XYZ ที่ใส่ไป คือ Vector ที่ไปทาง 45 องศา (x=1,y=1 วาดกราฟดู)

รูปแสดง ภาพวางโต็ะ หลังเสา

วันเสาร์ที่ 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>

วันเสาร์ที่ 30 สิงหาคม พ.ศ. 2557

ชุดคำสั่ง PowerAEC,DDD สำหรับ Nanocad


สำหรับผู้ที่เข้าอบรมพัฒนาโปรแกรม CAD บน NanoCAD5โดยสามารถ Download ชุดพัฒนา Rapid SDKได้ที่
http://goo.gl/TS5gDw


เมื่อลงแล้วเปิด Nanocad ต้อง Custom menu->Reset All ก่อน ถ้าเป็น Window 7 ต้อง Edit Permission ให้ User ->Read,Write  ใน โฟล์เดอร์ ของ Nanocad

สำหรับ Editor ใช้ ShapeDevelop 3
SharpDevelop

1. Reference ใน Project และใส่ using ด้วย
hostmgd.dll
hostdbmgd.dll
ppcad.dll  
ppgeninput.dll

2. Method ที่เรียก จะขึ้นด้วย public static void ชื่อโปรแกรม()


วันพฤหัสบดีที่ 27 มีนาคม พ.ศ. 2557

วิธีปิดรายการ Auto-complete ขึ้นคำสั่งใน Autocad 2014-2015

การขึ้น คำสั่ง หรือ Auto complete ใน Autocad 2014-2015 เป็นตัวช่วย ในการทำงาน หาคำสั่งที่อาจจะเขียนผิด ให้ถูกต้อง

 แต่สำหรับผู้ที่ใช้งานเป็นประจำ จะน่ารำคาญ มาก วิธีการปิด เป็นดังนี้
ให้กด Mouse ขวาไปที่ Command Line จะขึ้น เมนู ให้ปิด ที่ Input ให้หมดโดยเอาเครื่องหมายถูกออก

Autocad ก็จะไม่ Search และขึ้นรายการอีกต่อไป

วันพุธที่ 2 มกราคม พ.ศ. 2556

การ Sort จุดพิกัด ของ วัตถุ ในCAD ด้วย C#

จุดพิกัดของ วัตถุใน CAD มักจะเป็น จุดที่ประกอบด้วย Array ของ double (เลขทศนิยม) จำนวน 3 ตัว ที่จะทดแทนด้วย X,Y,Z เช่น
Point3d pt = new Point(10,20,0);
หมายถึง จุดพิกัด ที่มี ค่า X= 10 ค่า Y = 20 และค่า Z=0 เป็นต้น
แต่การใช้งานในหลาย กรณีเราอาจจะมีจุดเป็น ร้อยเป็นพัน การ ทำการ Sort ตามค่าเช่น ค่า X หรือ ค่า Y ก็จะเป็นเรื่องยุ่งยากพอสมควร ในกรณีนี้ ผมจะแนะนำการใช้ List ใน C# ซึ่งน่าจะง่ายกว่าวิธีการอื่นๆ

จาก Code
pts เป็น Array ของ จุดที่อาจจะมีเท่าไรก็ได้ เราจะใข้ xarr มาเป็นตัว Sort สำหรับค่า X
วิธีการก็คือว่า ใน List จะมีเครื่องมือ Sort ที่ใส่ Comparator ได้เอง


List<Point3d> xarr = new List<Point3d>();
//Dictionary<double, double> xarr = new Dictionary<double, double>();
for (int i = 0; i < pts.Count; i++)
{
xarr.Add(pts[i]);
}
Comparison<Point3d> cmpPt3 = delegate(Point3d p1, Point3d p2)
{ return (p1.X.CompareTo(p2.X)); };
xarr.Sort(cmpPt3);

เราก็จะสร้าง cmpPt3 เป็น comparator โดยที่จะเป็น delegate Function (function ที่เกิดเฉพาะงาน)
ด้วยวิธีการนี้ก็จะสามารถ Sort จุดพิกัดตามค่า X ได้อย่างไม่ยาก