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

ใช้ Dynamo ในการ Query ขนาดพื้นใน Revit และส่งไป Excel

เป็นตัวอย่างของการใช้ Query ขนาดพื้น


 ใน Revit และส่ง ไป Excel โดยเอาชื่อ Floor ที่อยู่ ใน Mark ไปด้วย
ในการทำงานนี้ ต้องตั้งค่า Mode ในการ Run เป็น Manual

ผลจะไปเปิด Excel และใส่ค่า




เคล็ดลับ อยู่ที่ Element.GetParameterValueByName สามารถรับเป็น Array ได้ และจะทำทุกตัว แล้วจากนั้น ไปทำการ List.Create ใม่ ให้เป็น 2 แถว(อย่าลืมกด+) จึงไปใส่ใน Data ของ ExcelWriteToFile ช่องสี่เหลี่ยม เล็กในแต่ละ Block จะเป็นการ Debug ค่า ในการ run


วันศุกร์ที่ 11 ธันวาคม พ.ศ. 2558

ใช้ Dynamo วาด กำแพงใน Revit

เป็นมั่ว อย่างมีหลักการ โดยเริ่มจาก Objective ก่อนว่าต้องการ กำแพง แล้วก็เอา กำแพงมาวาง
แล้วดูว่า ต้องการอะไรอีก เช่น Curve (แต่อันนี้ ต้องมีความรู้ก่อนว่า Line , Arc ก็คือ Curve เหมือนกัน)
ต้องการ Level ก็เอามาวาง  ต้องการ Height ก็มาวาง ถ้าขึ้น เหลือง ก็แสดงว่าไม่ได้ ก็ใช้ ช่อง Search ลองไปเรื่อย
แล้วก็ได้กำแพงที่ปรับค่าได้


.ในการใช้ Slider ต้องตั้ง Limit ใหม่ โดยการกดที่ลูกศรลง เพื่อให้พอกับขนาดกำแพง


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

เข้าใจเขียนโปรแกรมด้วยDynamo ใน Revit เบื้องต้น

เมื่อเริ่มต้น การใช้ Dynamo ต้องลงโปรแกรมก่อน (www.dynamobim.org)เมื่อลงแล้วจะมี Icon อยู่ใน หน้าAddin

ตัวอย่างนี้เป็นต้วอย่าง เข้าใจในหลักการง่ายๆของ Dynamo มีหลักว่า ทุกอย่างจะเห็นบนจอ
Dynamo จะเป็นตัวสร้างและคำนวน Revit จะเป็นต้วแสดงผล จะสะดวกมากถ้าเครื่องคอมมี 2 จอ
จะเป็นการสร้างจุด และควบคุมจุดจาก Input ใน Dynamo

เริ่มสร้างโครงการใน Revit เลือก New Conceptual Mass

ใน หน้า Addin เลือก Dynamo

เลือก New
ทีเมนูด้านข้าง เลือก Revit->Element->Reference->Reference Point->By Point

เลือกจะแสดง Object ใน Workspace
ขณะเดียวกัน  Revit ยังไม่แสดงจุดเนื่องจากยังไม่มี Input

ตอนนี้เราก็จะได้ Element ใน การจัดการแล้ว

ไปที่ Geometry->Point->By Coordinate(X Y Z)
แล้วกดที่ Point ลาก เชื่อมไปที่ pt ของ ReferencePoint

ใน Revit จะแสดงจุดแล้ว
ใส่ Input

เลือก  Core->Input->Number Slider  3 ครั้ง
แล้ว เชื่อม แต่ละอัน เข้า X,Y,Z ของ Point

ทดลอง ปรับ ค่า X, Y , Z จาก Slider ดู จะเห็นจุดเลื่อนตำแหน่งไปมา เป็นอันสำเร็จ


 แล้ว Save โปรแกรมเก็บใว้

สรุปการควบคุมจุดจะมาจาก โปรแกรม และค่าจาก Dynamo Object




การเขียนโปรแกรม ด้วย การวาด โปรแกรม Dynamo

Dynamo พัฒนาโดยบริษัท Autodesk inc. เพื่อใช้กับ โปรแกรม Revit เป็นโปรแกรมที่ทำให้ผู้ที่ไม่ได้เรียนมาใน สาขาคอมพิวเตอร์ ทำการเขียนโปรแกรมเพื่อสร้างแบบ 3 มิติ ได้อย่างที่ต้องการโดยใช้ การกำหนด เป็น Diagram ของแนวความคิด โดยย่อก ารทำงานเป็นจุด เรียกว่า Node เมื่อต้องการทำงานอะไร ก็ให้ไปหา Node ที่ต้องการมาในการสร้างโปรแกรม และในแต่ละ Node ก็จะบอก Input และ Output เป็นรูปภาพ(ตัวอย่างจาก Tutorial Dynamo)


โดยโปรแกรมมีตัวอย่าง มากดูได้จาก Web site
http://www.dynamobim.org

ความน่าสนใจไม่ได้อยู่ที่เขียนโปรแกรม แต่ทำให้การออกแบบสถาปัตย์ ที่มีรูปแบบ Freeform หรือ Wave เป็นไปได้ใน คอมพิวเตอร์ ซึ่งแบบในลักษณะดังกล่าวยากที่สร้างเป็น Model ขึ้นมา


วันพฤหัสบดีที่ 12 พฤศจิกายน พ.ศ. 2558

Revit API 2016 กับ การเลือก Selection Object และ อ่าน Parameter

Revit API 16 มีการเปลี่ยน 2 จุดที่มีผลกระทบกับโปรแกรมเก่าๆ
ส่วนแรกคือการ Select Object ตอนนี้ จะไม่สามารถ ได้ Element โดยตรง ต้องเป็น ElementId (อันนี้ดี จะได้เป็น ระบบหน่อย)

การเลือกในปัจจุบัน


   ICollection<ElementId> collectionIds = uidoc.Selection.GetElementIds();
    List<Element> founds = new List<Element>();
                foreach (ElementId eid2 in collectionIds)
                {
                    try
                    {
                        Element e2 = doc.GetElement(eid2);
                        founds.Add(e2);
                    }
                    catch { }
                }


founds จะเป็น Array ของ Element อีกที

กรณี ต้องการ แสดง ตัวที่เลือกบนจอ เพื่อให้ Properties ทำงาน แสดงค่า Element นั้น
ต้องใช้เป็น SetElementIds( ..)

   ICollection<ElementId> sIds = uidoc.Selection.GetElementIds();
            sIds.Clear();
           sIds.Add(showElement.Id);
            uidoc.Selection.SetElementIds(sIds);


สำหรับ Parameter การอ่านค่าจะอณุญาติ ให้ 1 Parameter มี มากกว่า 1 ค่า 

  IList    <Parameter>  l4s = (Parameter)e1.GetParameters("Base Level");
ถ้ามีตัวเดียว ให้เลือก l4s.First();


กรณีเลือกทั้งหมด ใช้วิธี Filter
   FilteredElementCollector collector
              = new FilteredElementCollector(doc)
                .WhereElementIsNotElementType();

            foreach (Element e in collector)

            {
     // do something
            }



วันศุกร์ที่ 6 พฤศจิกายน พ.ศ. 2558

เครื่องมือ Database SQLite กับ C#

เป็นTool สำเร็จรูปสำหรับ การ ทำงานกับ SQLite

https://www.dropbox.com/s/dm7y1t3pthj0et5/PPSqlLite.dll.7z?dl=0

ตัวอย่างวิธีใช้
/*
 * Created by SharpDevelop.
 * User: mcad
 * Date: 11/7/2015
 * Time: 1:16 PM
 *
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using PPSqlLite;

namespace db1
{
/// <summary>
/// Description of MainForm.
/// </summary>
public partial class MainForm : Form
{
public MainForm()
{
//
// The InitializeComponent() call is required for Windows Forms designer support.
//
InitializeComponent();

//
// TODO: Add constructor code after the InitializeComponent() call.
//
}
void Button1Click(object sender, EventArgs e)
{ // การอ่าน Data
PPSQLLite mysql = new PPSQLLite();
mysql.setSqlDataFile(@"c:\CAADDB\data.db");
ArrayList list1 =mysql.getAColSql("select name from customer");
listBox1.Items.Clear();
foreach(string astr in list1)
{
listBox1.Items.Add(astr);
}

}
void ListBox1SelectedIndexChanged(object sender, EventArgs e)
{
PPSQLLite mysql = new PPSQLLite();
mysql.setSqlDataFile(@"c:\CAADDB\data.db");
ArrayList list1 =mysql.getAColSql("select phone from customer where name='"
                                 +listBox1.SelectedItem.ToString()+"'");
if(list1!=null && list1.Count>0)
{
MessageBox.Show(list1[0].ToString());
}
}
void Button2Click(object sender, EventArgs e)
{ // การ Insert ใหม่ และ เช็คข้อมูลเก่า
PPSQLLite mysql = new PPSQLLite();
mysql.setSqlDataFile(@"c:\CAADDB\data.db");
ArrayList list1 =mysql.getAColSql("select max(id)+1 from customer");

if(list1!=null && list1.Count>0)
{
label1.Text=list1[0].ToString();
   }
string sqlIns="insert into customer values ("+
// insert field here
label1.Text +","+  // id
"'"+textBox1.Text +"',"+ // name
"'"+textBox2.Text +"',"+ // surname
textBox3.Text+","+ // age
"'"+textBox4.Text +"',"+ // phone
textBox5.Text // salary
+")";

// protect double click
ArrayList list2 = mysql.getAColSql("select name from customer where name='"+textBox1.Text+"'");
 if(list2!=null && list2.Count>0)
{
  MessageBox.Show("Already Exist");
 }
 else{
mysql.ExecuteQuery(sqlIns);
 }
 }
}
}

วันศุกร์ที่ 9 ตุลาคม พ.ศ. 2558

Autocad dotnet เวลา GetPoint ใน UCS ที่ไม่ใช่ World ตำแหน่งผิด

ในการ GetPoint ของ Autocad จะต่างกับ Nanocad นิดหนึ่ง คือ ของ Autocad จะได้พิกัดของ UCS นั้นๆ
การให้ เป็น WCS (World) ให้ทำได้โดยการ เอา Matrix ของ UCS นั้น คูณเข้าไป Nano จะได้ World เสมอ

Editor ed = appCad.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;

PromptPointResult ppr = ed.GetPoint("\nSpecify base point: ");
if (ppr.Status != PromptStatus.OK)
    return;

Point3d curPt = ppr.Value.TransformBy(ed.CurrentUserCoordinateSystem);