こんにちは、AMDlabの森山です。
前回まででAutoCADの基本的なアドインの作り方は説明し終えています。BricsCADやIJCADなど2DCADはほとんど同じ考え方な気がします。
今回は前回までのような話ではなく、せっかく作るのだからちょっと実用的なものを紹介しようと思います。
CSVから座標データを読み込み、ポリラインを引いていく、というものです。断面リストなんかを作りたいときに便利なんじゃないでしょうか。
準備
前回と同じプロジェクトファイルを使用するか、新しいプロジェクトを作って参照を同じように追加しておきましょう。
CommandHandler.csクラスは特に書き換えることがありません
Icon.csクラスはコマンドを置き換えるだけで終わります。主にCommand.csファイルを大きく変更していきます。
想定するCSVファイル
とりあえずこんな感じで座標が入れてあるCSVファイルを想定しておきます。
非常に単純なCSVファイルです。
Command.csファイルの記述
Autodeskのクラスを使ってCSVパスを手打ちで入力させてもいいのですが、今回はWindowsを想定しているので、Windows.Formsクラスを使ってしまいましょう。
System.Windows.Forms.dllを参照に追加してください。
では、コードです。CommandMethodはCreateLinefromCSVとしておきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
using System.IO; using System; using System.Windows.Forms; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using Application = Autodesk.AutoCAD.ApplicationServices.Application; using System.Collections.Generic; namespace AMDsample { public class Command { public List<double> OpenCSV() { //CSVファイルを読み込んでリストに収納していきます OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "csv file(*.csv)|*.csv"; ofd.Title = "開くファイルを選択してください"; ofd.RestoreDirectory = true; List<double> csv_lists = new List<double>(); //ダイアログを表示する if (ofd.ShowDialog() == DialogResult.OK) { //OKボタンがクリックされたとき、選択されたファイルを読み取り専用で開く Stream stream = ofd.OpenFile(); if (stream != null) { StreamReader sr = new StreamReader(ofd.FileName); { while (!sr.EndOfStream) { string line = sr.ReadLine(); string[] values = line.Split(','); double[] doubleArray = Array.ConvertAll(values, double.Parse); csv_lists.AddRange(doubleArray); } } } } else { Autodesk.AutoCAD.ApplicationServices.Core.Application.ShowAlertDialog("キャンセルされました"); } return csv_lists; } //コマンドメソッドの指定 [CommandMethod("CreateLinefromCSV")] public static void CreateRotatedDimension() { //アイコン追加 Icon icon = new Icon(); icon.IconButton(); Document now_Doc = Application.DocumentManager.MdiActiveDocument; Database now_CurDb = now_Doc.Database; List<double> point_lists = new List<double>(); Command command = new Command(); point_lists = command.OpenCSV(); //トランザクションの開始 using (Transaction Trans = now_CurDb.TransactionManager.StartTransaction()) { // ブロックテーブルの読み込み BlockTable BlkTbl; BlkTbl = Trans.GetObject(now_CurDb.BlockTableId, OpenMode.ForRead) as BlockTable; BlockTableRecord BlkTblRec; BlkTblRec = Trans.GetObject(BlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; //ポリラインを引く処理 using (Polyline polyline = new Polyline()) { for (int i = 0; i < point_lists.Count / 2; i++) { polyline.AddVertexAt(i, new Point2d(point_lists[2 * i], point_lists[2 * i + 1]), 0, 0, 0); polyline.Closed = true; } BlkTblRec.AppendEntity(polyline); Trans.AddNewlyCreatedDBObject(polyline, true); } //トランザクションの終了 Trans.Commit(); } } } } |
余談ですが、もしロケール対応などする場合はAutodesk.AutoCAD.Runtime.DynamicLinker.ProductLcidに言語情報があります。
System.Threading.Thread.CurrentThread.CurrentUICulture.Nameを参照してもAutoCADの言語情報は返さないのでご注意ください。
Icon.csファイルの記述
前回からこの部分はほとんど変わりません。CommandHandler.csやこのIcon.csは他のこういったEventがないプロジェクトにも応用可能です。
結局、アイコンを押したらコマンドラインに送信しているものは割と多い気がします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
using Autodesk.Windows; using System.Windows.Media.Imaging; using System.Reflection; public class Icon { public bool _added = false; public void IconButton() { //タブに同じものがない場合は実行されるようにする if (!_added) { RibbonControl ribbonControl = ComponentManager.Ribbon; RibbonTab Tab = null; foreach (RibbonTab tab in ribbonControl.Tabs) { if (tab.AutomationName == "Extra") { Tab = tab; break; } } if (Tab == null) { //タブの作成 Tab = new RibbonTab(); Tab.Title = "Extra"; Tab.Id = "EXTRA_TAB_ID"; ribbonControl.Tabs.Add(Tab); //パネルの作成 RibbonPanelSource srcPanel = new RibbonPanelSource(); srcPanel.Title = "CreateLinefromCSV"; srcPanel.Id = "CREATELINEFROMCSV_ID"; RibbonPanel Panel = new RibbonPanel(); Panel.Source = srcPanel; Tab.Panels.Add(Panel); //ボタンの作成、コマンドハンドラー実装 RibbonButton button = new RibbonButton(); button.CommandHandler = new CommandHandler(); button.CommandParameter = "._HelloWorld "; // 埋め込みソースの画像を使う場合には名前空間.画像名とします button.Text = "CreateLinefromCSV"; button.Size = RibbonItemSize.Large; button.Image = LoadImage("AMDsample.Logo100.jpg", 32, 32); button.LargeImage = LoadImage("AMDsample.Logo100.jpg", 64, 64); button.ShowText = true; RibbonRowPanel ribRowPanel = new RibbonRowPanel(); ribRowPanel.Items.Add(button); ribRowPanel.Items.Add(new RibbonRowBreak()); srcPanel.Items.Add(ribRowPanel); RibbonSeparator rsP = new RibbonSeparator(); rsP.SeparatorStyle = RibbonSeparatorStyle.Invisible; srcPanel.Items.Add(rsP); Tab.IsActive = true; _added = true; } } } //画像のBitmap化 public BitmapImage LoadImage(string imageName, int Height, int Width) { BitmapImage image = new BitmapImage(); image.BeginInit(); image.StreamSource = Assembly.GetExecutingAssembly().GetManifestResourceStream(imageName); image.DecodePixelHeight = Height; image.DecodePixelWidth = Width; image.EndInit(); return image; } } |
ではデバッグしていきましょう。実行結果です。
作りたい機能をどう作るか
ここから例えば寸法の自動追加など追加したい機能が出てくると思います。
基本的には公式から出ているドキュメントを読むことをお勧めします。
Autodesk 公式リファレンス
後は英語で検索するとAutodeskのフォーラムでよくやり取りがされています。それでもなお、基本的な情報が少ないですが…
アドイン制作は基本的にどのソフトも同じような感じです。
ここまで紹介したテクニックを使ってぜひ自分で作りたい機能を実装していってください!!
COMMENTS