การขึ้น คำสั่ง หรือ Auto complete ใน Autocad 2014-2015 เป็นตัวช่วย ในการทำงาน หาคำสั่งที่อาจจะเขียนผิด ให้ถูกต้อง
แต่สำหรับผู้ที่ใช้งานเป็นประจำ จะน่ารำคาญ มาก วิธีการปิด เป็นดังนี้
ให้กด Mouse ขวาไปที่ Command Line จะขึ้น เมนู ให้ปิด ที่ Input ให้หมดโดยเอาเครื่องหมายถูกออก
Autocad ก็จะไม่ Search และขึ้นรายการอีกต่อไป
วันพฤหัสบดีที่ 27 มีนาคม พ.ศ. 2557
วันพุธที่ 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 /HashSetใน C# ซึ่งน่าจะง่ายกว่าวิธีการอื่นๆ
จาก Code
pts เป็น Array ของ จุดที่อาจจะมีเท่าไรก็ได้ เราจะใข้ xarr มาเป็นตัว Sort สำหรับค่า X
วิธีการก็คือว่า ใน List จะมีเครื่องมือ Sort ที่ใส่ Comparator ได้เอง
เราก็จะสร้าง cmpPt3 เป็น comparator โดยที่จะเป็น delegate Function (function ที่เกิดเฉพาะงาน)
Point3d pt = new Point(10,20,0);
หมายถึง จุดพิกัด ที่มี ค่า X= 10 ค่า Y = 20 และค่า Z=0 เป็นต้น
แต่การใช้งานในหลาย กรณีเราอาจจะมีจุดเป็น ร้อยเป็นพัน การ ทำการ Sort ตามค่าเช่น ค่า X หรือ ค่า Y ก็จะเป็นเรื่องยุ่งยากพอสมควร ในกรณีนี้ ผมจะแนะนำการใช้ List /HashSetใน 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);
ด้วยวิธีการนี้ก็จะสามารถ Sort จุดพิกัดตามค่า X ได้อย่างไม่ยาก
นอกจากการใช้ List สามารถใช้
HashSet จะคล้าย กับ List แต่จะหา IntersectWith,UnionWith กับอีก HashSet ได้ และตัดตัวซ้ำให้
นอกจากการใช้ List สามารถใช้
HashSet จะคล้าย กับ List แต่จะหา IntersectWith,UnionWith กับอีก HashSet ได้ และตัดตัวซ้ำให้
วันจันทร์ที่ 17 ธันวาคม พ.ศ. 2555
สร้างเสาเป็น Element แรกใน Revit
เพื่อเป็นกำลังใจในการเริ่มเขียนโปรแกรมใน 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 ต่างๆตามในรูป
หา RevitApi และ Revit Sdk ได้ที่ใหน
บังเอิญว่ามีอาจาร์ยที่รู้จักกันสนใจต้องการแนะนำเริ่มเขียน C# บน Revit อยากทราบว่า จะไปหา SDK ตัวอย่างได้ที่ใหน ผมก็ลืมใส่ใว้ใน Post ก่อนหน้า
ไปที่นี่ครับ
http://usa.autodesk.com/adsk/servlet/index?siteID=123112&id=2484975
หรือ ใช้ Google search "revitsdk download"
ก็จะ Link มาที่นี้เช่นกัน
สำหรับข้อเขียนของตัวอย่างที่ Advance หน่อยก็ไปที่
http://thebuildingcoder.typepad.com
สำหรับการ ลง จะเป็นการแตกไฟล์ ที่ Pack มา ก็จะสร้างเป็น Folder
ไปที่นี่ครับ
http://usa.autodesk.com/adsk/servlet/index?siteID=123112&id=2484975
หรือ ใช้ Google search "revitsdk download"
ก็จะ Link มาที่นี้เช่นกัน
สำหรับข้อเขียนของตัวอย่างที่ Advance หน่อยก็ไปที่
http://thebuildingcoder.typepad.com
สำหรับการ ลง จะเป็นการแตกไฟล์ ที่ Pack มา ก็จะสร้างเป็น Folder
โดยตัวอย่างจะอยู่ใน Sample และที่สำคัญต้องลง Add-In Manager ที่อยู่ใน Folder ดังรูปก่อน จึงจะ ทำการ Load Add-in ตามตัวอย่างได้ สำหรับ Compiler ใช้ Visual Studio 2010 Professional ขึ้นไปหรือ Express (Free) ก็ได้ ไปที่
http://www.microsoft.com/visualstudio/eng/downloads
โปรแกรมที่ Compile แล้วจะได้เป็น <โปรแกรม>.dll จะนำมาใช้งาน จะใช้ Load และแสดงเป็นคำสั่ง
ถ้าต้องการทดสอบโปรแกรมก็ให้กด Run
เทคนิคอยู่นิดหนึ่งคือเมื่อสั่ง Save ใน Dialog Add-in แล้ว ต้องออกจาก Revit แล้วมาเข้าไหม่จะมี เมนูใน Add-in ปรากฏขึ้น เมื่อเข้าใหม่
การจัดการของ Family ใน Revit
การจัดการของ Family ใน Revit
อ.ธนะพันธ์ อินทรเกสร
ระบบ Family ใน Revit เป็นส่วนสำคัญมาก ที่ทำให้ Revit ใช้งานง่าย
ใน การจัดการ ของ Revit จะมี โครงสร้าง
3 ส่วน ได้แก่
1. Category จะบอกว่าเป็นหมวดของงานอะไร เช่น เป็นงานหลังคาก็ได้แก่
Roofs หรือ โครงสร้างเช่น Structural Beam Systems เป็นต้น
2. Family ได้แก่ สัญญลักษณ์ 3 มิติ หรือ 2 มิติ รูปของวัตถุนั้นเช่น
เสา Concrete หรือ เสา I beam เป็นต้น
3. Family Type เป็นการตั้งค่า ของ
Family ให้มีชื่อและขนาดตาม Parameter ตามต้องการ
4. Instances เป็น วัตถุ ในแบบที่เกิดจาก Family ที่เลือกมา โดยจะมี Id เฉพาะ ไม่ซ้ำ
จะเห็นว่าตัวแปรใน วัตถุจะมี 2 สถานะ ใน Instance จะเป็นตัวแปรเฉพาะตัว ส่วน type จะเป็นตัวแปรทั้งหมดใน type เดียวกัน
เพื่อสร้างโปรแกรมในการทำงาน อัตโนมัติ จะต้องนำ Family มาใช้ ต้องเข้าใจว่าใน แบบหรือ
project ที่ทำงานของ Revit จะเรียกว่า Document ที่จะบรรจุ Family เป็น Element (แบบเดียวกัน
กับ Block ใน Autocad และทุกอย่างใน Revit จะเรียกว่า Element) การมาใช้งาน จะสร้าง
Instance (แบบเดียวกับ BlockRefence ใน Autocad)
การขั้นแรก Scan ทั้ง Document ใส่ใน Array
Autodesk.Revit.DB.Document
document = commandData.Application.ActiveUIDocument.Document;
FilteredElementCollector collector = new FilteredElementCollector(document);
Collector จะมี ทุก Element ใน Project ปัจจุบัน ทั้ง Element ที่มองเห็น
ทั้ง View ทุกอย่าง เพื่อให้เหลือเฉพาะส่วนที่ต้องการการ เราจะต้องทำการ filter หรือกรอง
เฉพาะ Family โดยจะเรียกว่า FamilySymbol
ICollection<Element>
collection = collector.OfClass(typeof(FamilySymbol)).ToElements();
ตอนนี้เราจะได้ Family มาทั้งหมดแล้วใน collection ถ้าเราต้องการเฉพาะ
Category ใน Code จะเป็น
collection[i].Category.Name
ลองเขียนเป็นโปรแกรม
foreach (Element e in
collection)
{
familySymbol = e as FamilySymbol;
MessageBox.Show(familySymbol.Category.Name);
Family
fm = familySymbol.Family;
MessageBox.Show (fm.Name);
ElementType
et = e as ElementType;
if
(null != familySymbol.Category)
{
if ("Structural
Columns" == familySymbol.Category.Name)
{
MessageBox.Show (et.Name);
break;
}
}
}
สำหรับการแสดงชื่อของ Family จะใช้
Family fm = familySymbol.Family;
MessageBox.Show (fm.Name);
โดยที่ familySymbol จะเก็บทัง Category และ
Family
แต่
การที่จะเข้าไปใน Type จำเป็นต้องใช้ ElementType ในการ Cast Element เพื่อที่จะนำค่า
ElementType
มาใช้งาน
ถ้าต้องการ Type ก็ใช้
ElementType et = e as ElementType;
MessageBox.Show (et.Name);
Revit ใช้การเขียนโปรแกรมในระบบที่ทันสมัยมาก ได้ใช้ Linq ทำให้การเขียนโปรแกรมสั้นลงไปอย่างมาก
ผมจะแนะนำในตอนหน้า
วันพฤหัสบดีที่ 6 กันยายน พ.ศ. 2555
เรื่องของ BIM ด้วย Revit
ในการเขียนโปรแกรม BIM กำลังเป็นเรื่องที่ Hot ในวงการ CAD AEC โปรแกรมที่มีคนใช้งานจำนวนมาก ได้แก่ Revit ของ Autodesk ซึ่งเป็นผู้ผลิตโปรแกรม Autocad อันมีชื่อเสียงมานาน และ Archicad ในค่าย ยุโรป ผมขอเริ่มที่ Revit ก่อน
สำหรับการเขียน แบบด้วย Revit จะเรียกว่า เขียนคงจะไม่ใช่น่าจะเป็นการสร้างแบบจำลอง อาคาร
หรือ Model จะดีกว่า เพราะการเขียนแบบ จะเป็นการวาดเส้น ซึ่งไม่ใช่ใน Revit หลักการของโปรแกรมใน โปรแกรม BIM ให้คิดเสียว่าเป็นการ จำลองวัตถุ เข้าไปใน Space 3มิติ แต่ทำไมในวงการสถาปนิก กับ วิศวกรรม ก่อสร้าง ยังไม่แพร่หลายอย่างที่ควร ถ้าดูจาก Vesion ของRevit ปัจจุบัน ก็ 2013 ถ้านับที่เริ่มรู้จักกันในเมืองไทย ก็ Revit 2009 ประมาณ 4-5 ปี ยังมีผู้ใช้งานไม่มากนัก เท่าที่ควร อะไรคือปัญหา
ถ้าเราดูวิธีการทำงานในแบบ
ตอนวาดไม่เป็นไร แต่ต้องกำหนดข้อมูลแยะ นี่ คนวาด ไม่ชอบแล้วต้องคิดแยะ ก่อนทำ
แต่ก็มีข้อดีคือ เมื่อวาด เป็น 3D จะแปลงรูปเป็น 2D ก็ไม่ยากทั้งแปลนและรูปด้าน และ เปลี่ยนแบบ 3D จะแปลงเป็น2D ได้เช่นกัน
สำหรับการเขียน แบบด้วย Revit จะเรียกว่า เขียนคงจะไม่ใช่น่าจะเป็นการสร้างแบบจำลอง อาคาร
หรือ Model จะดีกว่า เพราะการเขียนแบบ จะเป็นการวาดเส้น ซึ่งไม่ใช่ใน Revit หลักการของโปรแกรมใน โปรแกรม BIM ให้คิดเสียว่าเป็นการ จำลองวัตถุ เข้าไปใน Space 3มิติ แต่ทำไมในวงการสถาปนิก กับ วิศวกรรม ก่อสร้าง ยังไม่แพร่หลายอย่างที่ควร ถ้าดูจาก Vesion ของRevit ปัจจุบัน ก็ 2013 ถ้านับที่เริ่มรู้จักกันในเมืองไทย ก็ Revit 2009 ประมาณ 4-5 ปี ยังมีผู้ใช้งานไม่มากนัก เท่าที่ควร อะไรคือปัญหา
ถ้าเราดูวิธีการทำงานในแบบ
แบบแปลนของ อาคาร ที่เราเขียน จะใช้ สัญญลักษณ์ ที่เรียกว่า Block และ เส้นต่างๆ ให้ ความหมาย เช่น กำแพง เป็นเส้นคู่ หน้าต่างประตูก็ใช้ สัญญลักษณ์ และมี Tag กำกับ ถ้าคนเขียนเป็น ใน Autocad จะใช้เวลาไม่เกิน 15 นาที่ ก็สามารถ ทำแบบ นี้ได้
ที่นี้ไปดูใน โปรแกรม Bim เช่น Revit ในการสร้างกำแพง จะต้องบอก คุณสมบัติในการวางวัตถุ เช่น ความสูงจากพื้น ความหนากำแพง และวัสดุที่ใช้ รวมทั้งระยะ ชั้น 2 ด้วย
แต่ก็มีข้อดีคือ เมื่อวาด เป็น 3D จะแปลงรูปเป็น 2D ก็ไม่ยากทั้งแปลนและรูปด้าน และ เปลี่ยนแบบ 3D จะแปลงเป็น2D ได้เช่นกัน
แต่ถ้านำไปใช้ในงานก่อสร้าง หรือขออนุญาติ ได้หรือยัง ยังอีกพอสมควรครับ ต้องเขียนแบบ 2D
อีก อันนี้ทำให้หลายคนที่ใช้ พบว่าโปรแกรมไม่ทำงานแบบเบ็ดเสร็จ ต้องกลับไป ระหว่าง Autocad กับ Revit (ความจริง Revit เขียนแบบ 2D ได้ครับ แต่ไม่เก่งเท่า Autocad) แต่อย่างไรก็ดี Revit Bim ก็ให้ข้อมูลที่สำคัญหลายอย่าง เช่น นำ้หนัก วัสดุ การเชื่อมต่อเช่น คาน เสา เป็นต้น อันไปใช้ในการคำนวน และ การวางแผนได้หลายอย่าง อันนี้ ต้องเขียน โปรแกรมกัน ซึ่งผมจะเริ่มอธิบายขั้นตอน ที่จะทำให้ การใช้ BIM ทำงานแบบ อัตโนมัติในการสร้าง แบบ 2มิติ และไปคำนวนด้วย Revit เป็นโปรแกรมที่ทันสมัยในการเขียนโปรแกรมหลายอย่าง ที่ผมจะอธิบายใน Post ต่อไป
Tag: เรียน Bim, Bim ศิลปากร, เขียนโปรแกรม Revit, Revit API
วันพฤหัสบดีที่ 21 มิถุนายน พ.ศ. 2555
การนำ C# มาใช้งาน กับ Ruby C/C++ ภาคที่ 2 ติดต่อกับRuby
-Thanaphan In.
ในบทที่แล้ว ได้แนะนำการใช้งานที่ ให้สร้าง C# เป็น Com Interface สำหรับให้ โปรแกรม อื่นใน window
สามารถ
ติดต่อกันได้ ได้ สำหรับ การใช้งาน กับ ภาษา Ruby ไม่ว่าจะเป็น Sketchup หรือ Ruby on Rail ก็สามารถใช้งานได้ 2
ทาง คือ ผ่าน Interface
ของ C/C++ หรือ ผ่าน “win32ole”
สำหรับ win32ole
มีตัวอย่างบน Internet
พอสมควรแล้ว(ค้นใน Google “ruby
win32ole”) สำหรับ การใช้ C/C++
มีขอที่ดีคือสามารถใช้
Debuger ของ Visual Studio ดูระหว่างทำงานได้ เพื่อสะดวกการสร้าง เป็น Class Interface ระหว่าง C++ กับ C# การเขียนโปรแกรมจะได้ ใช้ Visual
Studio เป็นส่วนใหญ่
ไปที่ตัวอย่างที่สร้าง Dialog บน MFC สร้างปุ่มกด
Add C# และมี EditBox ตามรูป
สำหรับหัวไฟล์ ให้ใส่เพิ่ม #import
#include "stdafx.h"
#include "winsock.h"
#include "ruby.h"
#include "rbMfc1.h"
#include "rbDlgMFC1.h"
#include "rubyutils.h"
#import "Mathlib.tlb"
raw_interfaces_only
|
ที่ EditBox add Variable ด้วยกดเมาวส์ขวา ชื่อ c_Edit1
สร้างคำสั่งสำหรับปุ่มแรก
void CtestCallManageDlg::OnBnClickedButton1()
{
// TODO: Add
your control notification handler code here
HRESULT hr= CoInitialize(NULL); // เริ่ม Interface
MathLib::IAddClassPtr
pIAddClass(__uuidof(CAddClass));//คลาสใน C#
long result=0;
hr=pIAddClass->Add(10,20,&result);//Function ใน Interface C#
CoUninitialize();// จบ Interface
CString outt;
outt.Format(_T("%d"),result);
this->c_Edit1.SetWindowTextW(outt);
}
|
สำหรับ Form ให้ สร้างอีกปุ่ม (การสร้างให้กด double Click ที่ปุ่ม)
void CtestCallManageDlg::OnBnClickedButton2()
{
// TODO: Add
your control notification handler code here
HRESULT hr= CoInitialize(NULL);
MathLib::IForm1Ptr pIForm(__uuidof(CiForm1));
long result=0;
hr= pIForm->aForm(&result);//Function ในการเรียก Form
CoUninitialize();
CString outt;
outt.Format(_T("%d"),result);
// this->c_Edit1.SetWindowTextW(outt);
}
|
จากนั้น Build และทำการ Copy Mathlib.dll ไปที่ google..\plugins ไม่นั้นจะทำงานไม่ได้
สมัครสมาชิก:
บทความ (Atom)












