วันศุกร์ที่ 17 กุมภาพันธ์ พ.ศ. 2560

โปรแกรม Linq กับ SQLite ใน Visual Studio

วิธีใช้ Linq สำหรับ การ Connect กับ SQLite ใน Visual studio

กระบวนการ
1. ใน SQLite สร้าง Database และ Table ก่อน โดยใช้ SQLiteStudio ต้องใช้ Version 2,1 เท่านั้น

2. จด ชื่อ File กับ Table ใว้

3. ใน Visual studio เปิด Project ที่ต้องการ ต่อ SQLite และให้ ไปที่ Nuget Pakage Manager
 เลือก SQLite

4.  ทำการแก้ App.config

ชื่อ name ต้องตรงกับ File และ ใน Connection String ต้องตรงกับ ที่เก็บใว้
  <connectionStrings>
    <add name="myDb1" connectionString="Data Source=|DataDirectory|c:/temp/FormSQL/FormSQL/myDb1.db" 
         providerName="System.Data.SQLite.EF6" />
  </connectionStrings>

5. สร้าง Class สำหรับ SQLite file
  
using System.Data.SQLite.EF6;
using System.Data.Entity.ModelConfiguration.Conventions;

namespace FormSQL
{
    class myDb1 : DbContext
    { // set database(DbContext) and table (DbSet) <class> of table
        public DbSet<Customer> Customer { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }
}

6. สร้าง Class สำหรับ Table


namespace FormSQL
{

    public class Customer
    {
        public string Id { get; set; }
        public string NAME { get; set; }
        public string SURNAME { get; set; }
        public string PHONE { get; set; }
        public double SALARY { get; set; }

       
    }
}

7. สร้างโปรแกรม ทดสอบ

 private void  testLinq()
        {
            var db1 = new myDb1();
            var aname = db1.Customer.Single(a => a.NAME == "MyName");
            aname.SALARY = 20000;
            db1.SaveChanges();
        }

แล้วดูผล จะเห็นว่า ใช้ Linq เรียก หา Record ที่ Name เท่ากับ MyName และเมื่อได้ Record Data มา ก็จะทำการแก้ไข โดย ตั้งค่า SALARY ใหม่ เป็น 20000 และ สั่ง SaveChanges() เพื่อ Update
ซึ่งเท่ากับ
การ Select * from Customer where Name='MyName'
และ Update Customer set (SALARY=2000 ) Where Name='MyName'

reference
https://github.com/JVimes/LinqSqLiteExample

// Add

  var db1 = new myDb1();
            Customer myname= new Customer();
            myname.Id="0071";
            myname.NAME = "Hello";
            myname.SURNAME="SSS";
            myname.PHONE="1234";
            myname.SALARY=100;
            db1.Customer.Add(myname);

            db1.Customer.Add(new Customer { 
            Id="009"
            NAME="Hellox"
            SURNAME="VA",
            PHONE="293993",
            SALARY=300
            });
            // commit

            db1.SaveChanges();

// Remove
   var db1 = new myDb1();
             var aname = db1.Customer.Single(a => a.NAME == "Hello");
             db1.Customer.Remove(aname);
             db1.SaveChanges();
//Select where
  var db1 = new myDb1();
            var ar1 = db1.Customer.Where(a => a.SALARY > 200).ToArray();
           
            dataGridView1.AutoGenerateColumns = true;
            dataGridView1.DataSource = ar1;
            dataGridView1.Refresh();

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

Compile Dotnet บน GStar Cad

GstarCAD  เป็น CAD จีนที่ ราคาไม่แพง เล็ก เร็ว 64bits ด้วย การเขียนโปรแกรม บน dotnet ทำได้เหมือนกับ Autocad โดยที่ GstarCAD 2017 (http://www.gstarcad.net) จะมี API แบบเดียวกับ Autocad 2012
โดยที่ จะต้อง reference Dll 2 ตัว
   ได้แก่ GMAP.dll และ GMDB.dll แล้ว (แทน acmgd.dll ,acmdb.dll)
แก้ Using
จาก Autodesk.Autocad.. -> GRxCAD...
ก็จะ compile ได้ และ เลือก เป็น Dotnet 4 (Autocad เป็น 3.5)
เรียก netload เหมือน Autocad เรียกคำสั่งเดียวกัน


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

autocad 2011-12 load โปรแกรม dotnet 4 สำหรับ Visual Studio 2013-15

Autocad 2011-12 พัฒนาบน Dotnet3.5 จะ Load โปรแกรมบางตัวไม่ได้ ที่ ต้อง Load Dotnet 4.0
สามารถ ทำได้ โดย แก้ที่ acad.exe.config

<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>

<!--All assemblies in AutoCAD are fully trusted so there's no point generating publisher evidence-->
   <runtime>      
<generatePublisherEvidence enabled="false"/>  
   </runtime>
</configuration>

วันอังคารที่ 13 ธันวาคม พ.ศ. 2559

Revit API MessageBox จาก TaskDialog

TaskDialog ถ้าไม่มี Option อะไรเลย จะเป็น Message ธรรมดา

TaskDialog.Show("Title","Message");

จะมีแค่ ปิด Dialog เท่านั้น
กรณีต้องการ "Yes", "No"
ให้เพิ่ม
 TaskDialogResult tdr=   TaskDialog.Show("วัตถุนี้เป็น Link!", "ตอบ (Yes) หรือ (No)", TaskDialogCommonButtons.Yes | TaskDialogCommonButtons.No);

         TaskDialog.Show("??",tdr.ToString());

จะได้ผล เป็น "Yes" หรือ "No"

และถ้าต้องการหลายๆ ทางเลือก
ลอง แบบนี้

TaskDialog td = new TaskDialog("Decision");
            td.MainContent = "What do you want to do?";
            td.AddCommandLink(TaskDialogCommandLinkId.CommandLink1,
                               "Use Simple Insertion Point",
                               "This option works for free-floating items");
            td.AddCommandLink(TaskDialogCommandLinkId.CommandLink2,
                                "Use Face Reference",
                                "Use this option to place the family on a wall or other surface");

            switch (td.Show())
            {
                case TaskDialogResult.CommandLink1:
                    // do the simple stuff
                    break;

                case TaskDialogResult.CommandLink2:
                    // do the face reference
                    break;

                default:
                    // handle any other case.
                    break;
            }

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

C# MessageBox Input แบบง่ายๆ

ต้องการ Message Box Input แบบง่ายๆ ไม่ต้องการสร้าง Form ต่อ ท้าย ใน Class ที่กำลังทำอยู่
เวลาเรียกใช้ ก็

String ins=InputPrompt.ShowDialog("Hello","Question"," default");


 public static class InputPrompt
    {
        public static string ShowDialog(string text, string caption,string defText)
        {
            Form prompt = new Form()
            {
                Width = 500,
                Height = 150,
                FormBorderStyle = FormBorderStyle.FixedSingle,
                Text = caption,
                StartPosition = FormStartPosition.CenterScreen
            };
            Label textLabel = new Label() { Left = 50, Top = 20, Text = text };
            TextBox textBox = new TextBox() { Left = 50, Top = 50, Width = 400 };
            Button confirmation = new Button() { Text = "Ok", Left = 350, Width = 100, Top = 70, DialogResult = DialogResult.OK };
            confirmation.Click += (sender, e) => { prompt.Close(); };
            prompt.Controls.Add(textBox);
            prompt.Controls.Add(confirmation);
            prompt.Controls.Add(textLabel);
            prompt.AcceptButton = confirmation;
            if (defText != null) textBox.Text = defText;
            return prompt.ShowDialog() == DialogResult.OK ? textBox.Text : "";
        }

    }

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

Revit API แปลง Units


แปลงจาก ฟุต เป็น เมตร 

double asMeter = UnitUtils.Convert(cl.Width, DisplayUnitType.DUT_DECIMAL_FEET, DisplayUnitType.DUT_METERS);

แสดง Unit ปัจจุบันใน Document

Units units = doc.GetUnits();
            string outStr = "";
            IList<UnitType> unitTypes = UnitUtils.GetValidUnitTypes();

          uL= unitTypes.Where(x => x.ToString() == "UT_Length").First();
         FormatOptions fmtOpts = units.GetFormatOptions(ut);
         string du = fmtOpts.DisplayUnits.ToString();

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

การอ่านค่าจาก Schedule API ใน Revit

Schedule API เป็น ส่วนที่เพิ่มเติมมาใหม่ใน Revit API 2014 โดยที่ผู้ใช้งาน สามารถ อ่านค่า จาก View มาได้ ทั้งชื่อชอง View และ Table ของ ตาราง

ViewSchedule จะเป็น class ลูกจาก View  โดยตารางจะอยู่ใน TableData ข้อมูล จะอยู่ใน
ชื่ออยู่ใน currentView.Name
SectionType.Body


ตัวอย่างนี้ จะออกเป็น CSV format

 View currentView = uDoc.ActiveView;

string vName = currentView.Name;  // Schedule name
            ViewSchedule vs = currentView as ViewSchedule;
            TableData vd = vs.GetTableData();
            TableSectionData tds = vd.GetSectionData(SectionType.Body);
            int rCount = tds.NumberOfRows;
            int rCol = tds.NumberOfColumns;
            string allSchAll = "";
            for (int i = 0; i < rCount; i++)
            {
                string sLine = "";
                for (int j = 0; j < rCol; j++)
                {
                    sLine += tds.GetCellText(i, j)+",";
                }
                allSchAll += sLine;
            }

            TaskDialog.Show("data", allSchAll);