<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9208187663079327848</id><updated>2012-02-17T00:15:29.096+09:00</updated><category term='AutoLISP'/><category term='.NET'/><title type='text'>ACAD Video Programing</title><subtitle type='html'>&lt;p&gt;AutoCAD のプログラミング（.NET、AutoLISP）に関するブログです。&lt;/p&gt;
&lt;p&gt;.NET を使ってのプログラミングは 2010 年 4 月から始めました。
私が勉強した内容などをブログに載せていこうと思ってるので、.NET を始めようと思ってる人、始めて間もない人などの参考になればと思ってます。&lt;/p&gt;
&lt;p&gt;AutoCAD/AutoCAD LT の機能に関しては、&lt;a href="http://blog.acadvideo.com/"&gt; ACAD Video &lt;/a&gt;で書いてます。&lt;/p&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>52</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-7594390616572950393</id><published>2011-02-26T11:17:00.003+09:00</published><updated>2011-03-03T11:09:06.407+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET - 異なる値で連続オフセットするプログラムを作ってみました（AutoCAD 2011）</title><content type='html'>&lt;iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Facadvideo-programing.blogspot.com%2F2011%2F02%2Fnet-autocad-2011_26.html&amp;amp;layout=standard&amp;amp;show_faces=false&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=35" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:35px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;br /&gt;先日&lt;a href="http://blog.acadvideo.com/2011/02/autocad-2011_22.html"&gt;異なる値で連続オフセットする（AutoCAD 2011）&lt;/a&gt;で書きましたが、異なる値で連続オフセットするプログラムを作ってみました。&lt;br /&gt;&lt;br /&gt;GetOffsetCurves メソッドでオフセットできるみたいだったので、結構簡単に作れるのかなと思って始めたんですた、なかなか難しかったです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;最初につまずいたのは、AutoCAD の OFFSET コマンドみたいにオフセットする側をクリックして指定できたら便利だと思ったんですが、どうやってやればいいのやら？？？&lt;br /&gt;&lt;br /&gt;そのためのメソッドとかなにかあるのかなと思ったんですが、見つけられませんでした。&lt;br /&gt;いろいろググッても見たんですが、それでも何も見つけられなくて…&lt;br /&gt;&lt;br /&gt;ほとんど諦めかけてたんですが、ひょっとして 「元のオブジェクト と クリックした点の最短距離」 と 「オフセットしたオブジェクト と&amp;nbsp;リックした点の最短距離」&amp;nbsp;を比較すればいのかなって思ってやってみたらできました。&lt;br /&gt;&lt;br /&gt;もっといい方法があるのかどうかは分かりませんが、とりあえずできたのでよしとしましょう。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;GetClosestPointTo メソッドで、クリックした点から一番近いオブジェクト上の点を求めて、DistanceTo メソッドで距離を求めました。&lt;br /&gt;&lt;br /&gt;で、連続オフセットする最初の一回目だけ、&amp;nbsp;「元のオブジェクト と クリックした点の最短距離」 と 「オフセットしたオブジェクト と&amp;nbsp;リックした点の最短距離」&amp;nbsp;を比較して、前者より後者の方が大きかったときはオフセットする方向を反対にしました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;それと、UCS を変更するとうまくいかないことがあるみたいだったので、UCS を WCS に変換するっていう手順も追加しました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;コードはこんな感じです。&lt;br /&gt;' ---------------------------------------------&lt;br /&gt;Imports System&lt;br /&gt;Imports Autodesk.AutoCAD.Runtime&lt;br /&gt;Imports Autodesk.AutoCAD.ApplicationServices&lt;br /&gt;Imports Autodesk.AutoCAD.DatabaseServices&lt;br /&gt;Imports Autodesk.AutoCAD.Geometry&lt;br /&gt;Imports Autodesk.AutoCAD.EditorInput&lt;br /&gt;Imports AVDO_Offset.DemandLoading.RegistryUpdate&lt;br /&gt;&lt;br /&gt;' This line is not mandatory, but improves loading performances&lt;br /&gt;&amp;lt;Assembly: CommandClass(GetType(AVDO_Offset.MyCommands))&amp;gt;&lt;br /&gt;&lt;br /&gt;Namespace AVDO_Offset&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Public Class MyCommands&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;CommandMethod("AVDO_Offset", "AVDO_Offset", CommandFlags.Modal + CommandFlags.UsePickSet)&amp;gt; _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Public Sub AVDO_Offset()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim doc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim db As Database = doc.Database&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ed As Editor = doc.Editor&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' オフセットのために選択したオブジェクトのオブジェクトID&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim selEntID As ObjectId&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' PickFirst 選択セットを取得&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim psr As PromptSelectionResult = ed.SelectImplied()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If psr.Status = PromptStatus.OK Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If psr.Value.Count &amp;gt; 1 Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' 複数のオブジェクトが PickFirst 選択セットに含まれているときは、ひとつのオブジェクトを選択しなおす&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;selEntID = ed.GetEntity("オブジェクトを選択").ObjectId&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Else&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' ひとつだけのオブジェクトが PickFirst 選択セットに含まれているときは、そのオブジェクトIDを使用&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;selEntID = psr.Value.GetObjectIds(0)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Else&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' PickFirst 選択セットを取得できなかったときオブジェクトをオブジェクトを選択する&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;selEntID = ed.GetEntity(vbCrLf &amp;amp; "オブジェクトを選択").ObjectId&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' 何も選択されていなかったら、コマンドを終了する&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If selEntID.IsValid = False Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Using trans As Transaction = db.TransactionManager.StartTransaction&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ent As Entity = trans.GetObject(selEntID, OpenMode.ForRead)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' 選択されたオブジェクトが、オフセットの対象でない場合はコマンドを終了する&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If (TypeOf ent Is Line) _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Or (TypeOf ent Is Arc) _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Or (TypeOf ent Is Circle) _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Or (TypeOf ent Is Ellipse) _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Or (TypeOf ent Is Polyline) _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Or (TypeOf ent Is Polyline2d) _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Or (TypeOf ent Is Spline) _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Or (TypeOf ent Is Xline) Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Else&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ed.WriteMessage(vbCrLf &amp;amp; "このオブジェクトはオフセットできません。")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Using&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' オフセットする方向を指定&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ppo As PromptPointOptions = New PromptPointOptions(vbCrLf &amp;amp; "オフセットする側の点を指定")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ppr As PromptPointResult&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ppr = ed.GetPoint(ppo)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If ppr.Status &amp;lt;&amp;gt; PromptStatus.OK Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' オフセットする距離&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim dist As Double = 0&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' オフセットする距離の追加分&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim distAdd As Double = 0&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' オフセットしている回数&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim cnt As Integer = 0&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' オフセットする側&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ofstDirection As Boolean = True&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;While True&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Using trans As Transaction = db.TransactionManager.StartTransaction&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim bt As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForRead)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim btRec As BlockTableRecord&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim cSpace As BlockTableRecord = trans.GetObject(db.CurrentSpaceId, OpenMode.ForRead)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If cSpace.Name = "*Model_Space" Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;btRec = trans.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Else&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;btRec = trans.GetObject(bt(BlockTableRecord.PaperSpace), OpenMode.ForWrite)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' 選択したオブジェクトに対して実行&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ent As Entity = trans.GetObject(selEntID, OpenMode.ForRead)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'オフセットされたオブジェクトコレクション&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim dbObjColl As DBObjectCollection = Nothing&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' オフセットする距離を入力させる&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim pdo As PromptDistanceOptions&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If cnt = 0 Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pdo = New PromptDistanceOptions(vbCrLf &amp;amp; "距離を指定してください")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Else&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pdo = New PromptDistanceOptions(vbCrLf &amp;amp; "距離を指定してください&amp;lt;" &amp;amp; distAdd &amp;amp; "&amp;gt;")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pdo.AllowNone = True&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pdo.AllowNegative = False&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pdo.Keywords.Add("eXit", "eXit", "終了(X)")&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim pdr As PromptDoubleResult&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pdr = ed.GetDistance(pdo)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If pdr.Status &amp;lt;&amp;gt; PromptStatus.None Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;distAdd = pdr.Value&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' [終了(X)] オプションが選択されたときは、コマンドを終了&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If pdr.StringResult = "eXit" Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If cnt = 0 Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If pdr.Status &amp;lt;&amp;gt; PromptStatus.OK Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Else&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If (pdr.Status &amp;lt;&amp;gt; PromptStatus.OK) And (pdr.Status &amp;lt;&amp;gt; PromptStatus.None) Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dist = dist + distAdd&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' それぞれのオブジェクトに対するオブジェクトコレクションを作成&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ofstent As Curve = ent&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' GetOffsetCurves で使うオフセット値&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ofstDist As Double&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If ofstDirection = True Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ofstDist = dist&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Else&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ofstDist = 0 - dist&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' オフセットしたオブジェクトを作成&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dbObjColl = ofstent.GetOffsetCurves(ofstDist)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Catch ex As Autodesk.AutoCAD.Runtime.Exception&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ed.WriteMessage(vbCrLf &amp;amp; "このオブジェクトはオフセットできません。")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Try&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' UCS を WCS に変換&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim vpTblRec As ViewportTableRecord = trans.GetObject(doc.Editor.ActiveViewportId, OpenMode.ForWrite)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim newMatrix As Matrix3d = New Matrix3d()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;newMatrix = Matrix3d.AlignCoordinateSystem(Point3d.Origin, _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Vector3d.XAxis, _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Vector3d.YAxis, _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Vector3d.ZAxis, _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; vpTblRec.Ucs.Origin, _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; vpTblRec.Ucs.Xaxis, _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; vpTblRec.Ucs.Yaxis, _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; vpTblRec.Ucs.Zaxis)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim pprWCS As Point3d = ppr.Value.TransformBy(newMatrix)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' オフセットする側が正しいか確認し、間違っていれば反対にする&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim distOrg As Double = ofstent.GetClosestPointTo(pprWCS, True).DistanceTo(pprWCS) &amp;nbsp;' 元のオブジェクトと指定した点の距離&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim distOfst As Double = distPtoObjColl(pprWCS, dbObjColl) &amp;nbsp;' オフセットしたオブジェクトと指定した点の距離&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' 最初のオフセットのときに、オフセットする側が正しいか確認&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If (cnt = 0) And (distOrg &amp;lt; distOfst) Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dbObjColl.Dispose()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dbObjColl = ofstent.GetOffsetCurves(-dist)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Catch ex As Autodesk.AutoCAD.Runtime.Exception&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ed.WriteMessage(vbCrLf &amp;amp; "このオブジェクトはオフセットできません。")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ofstDirection = False&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cnt += 1&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' オフセットされたオブジェクトを追加&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If dbObjColl &amp;lt;&amp;gt; Nothing Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For Each acEnt As Entity In dbObjColl&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;btRec.AppendEntity(acEnt)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;trans.AddNewlyCreatedDBObject(acEnt, True)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Next&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;trans.Commit()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Catch ex As Autodesk.AutoCAD.Runtime.Exception&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MsgBox(ex.Message)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Using&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End While&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Sub&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' ある点と、オブジェクトコレクションにあるオブジェクトの最短距離を求める関数&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Public Function distPtoObjColl(ByVal pt As Point3d, ByVal dbObjColl As DBObjectCollection) As Double&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim dist As Double = 10 ^ 100&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For Each acEnt As Curve In dbObjColl&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim pt2 As Point3d = acEnt.GetClosestPointTo(pt, True)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim distTemp As Double = pt.DistanceTo(pt2)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If distTemp &amp;lt; dist Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dist = distTemp&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Next&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return dist&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Function&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;End Class&lt;br /&gt;End Namespace&lt;br /&gt;' ---------------------------------------------&lt;br /&gt;&lt;div id="fb-root"&gt;&lt;/div&gt;&lt;script src="http://connect.facebook.net/en_US/all.js#appId=APP_ID&amp;amp;xfbml=1"&gt;&lt;/script&gt;&lt;fb:comments href="http://acadvideo-programing.blogspot.com/2011/02/net-autocad-2011_26.html" num_posts="3" width="500"&gt;&lt;/fb:comments&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-7594390616572950393?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/7594390616572950393/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2011/02/net-autocad-2011_26.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/7594390616572950393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/7594390616572950393'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2011/02/net-autocad-2011_26.html' title='.NET - 異なる値で連続オフセットするプログラムを作ってみました（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-3135677792910457061</id><published>2011-02-03T18:40:00.001+09:00</published><updated>2011-02-03T18:41:43.483+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET でプロファイルを変更する（AutoCAD 2011）</title><content type='html'>&lt;iframe allowtransparency="true" frameborder="0" scrolling="no" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Facadvideo-programing.blogspot.com%2F2011%2F02%2Fnet-autocad-2011.html&amp;amp;layout=standard&amp;amp;show_faces=false&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=35" style="border: none; height: 35px; overflow: hidden; width: 450px;"&gt;&lt;/iframe&gt;&lt;br /&gt;プロファイルを変更するには［オプション］ダイアログの［プロファイル］タブで、変更したいプロファイルをダブルクリックするんですが、ちょっと面倒くさいなと思って&amp;nbsp;.NET でコマンド作れないかいろいろググリながらやってみました。&lt;br /&gt;&lt;br /&gt;私の場合は以下の 2D 用と 3D 用のプロファイルがあります。&lt;br /&gt;&lt;blockquote&gt;ACAD Video 2D&lt;br /&gt;ACAD Video 3D&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_-VEZIC7K5VU/TUp30fi4r_I/AAAAAAAAATo/8cblctcIg9w/s1600/Profile.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="285" src="http://3.bp.blogspot.com/_-VEZIC7K5VU/TUp30fi4r_I/AAAAAAAAATo/8cblctcIg9w/s400/Profile.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;それを入れ替えるコマンドを作ってみました。&lt;br /&gt;&lt;blockquote&gt;2D 用のプロファイルにするコマンド　：　AVDO_2D&lt;br /&gt;3D 用のプロファイルにするコマンド　：　AVDO_3D&lt;/blockquote&gt;コードはこんな感じです。&lt;br /&gt;--------------------------------------------------&lt;br /&gt;Imports System&lt;br /&gt;Imports Autodesk.AutoCAD.Runtime&lt;br /&gt;Imports Autodesk.AutoCAD.ApplicationServices&lt;br /&gt;Imports Autodesk.AutoCAD.DatabaseServices&lt;br /&gt;Imports Autodesk.AutoCAD.Geometry&lt;br /&gt;Imports Autodesk.AutoCAD.EditorInput&lt;br /&gt;Imports Autodesk.AutoCAD.Interop&lt;br /&gt;&lt;br /&gt;' This line is not mandatory, but improves loading performances&lt;br /&gt;&amp;lt;Assembly: CommandClass(GetType(AVDO_ChWsProfile.MyCommands))&amp;gt;&lt;br /&gt;&lt;br /&gt;Namespace AVDO_ChWsProfile&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Public Class MyCommands&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Const p2d As String = "ACAD Video 2D" &amp;nbsp; &amp;nbsp; &amp;nbsp;' 2D 用のプロファイルの名前&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Const p3d As String = "ACAD Video 3D" &amp;nbsp; &amp;nbsp; &amp;nbsp;' 3D 用のプロファイルの名前&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;CommandMethod("AVDO_ChWsProfile", "AVDO_2D", "AVDO_2D", CommandFlags.Modal)&amp;gt; _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Public Sub AVDO_2D()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ap As AcadPreferences = Application.Preferences&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If ap.Profiles.ActiveProfile = p2d Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MsgBox("プロファイルは既に " &amp;amp; p2d &amp;amp; " になっています。")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If ChProperty(p2d) Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ap.Profiles.ActiveProfile = p2d&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Else&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MsgBox(p2d &amp;amp; " というプロファイルがありません。")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Sub&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;CommandMethod("AVDO_ChWsProfile", "AVDO_3D", "AVDO_3D", CommandFlags.Modal)&amp;gt; _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Public Sub AVDO_3D()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ap As AcadPreferences = Application.Preferences&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If ap.Profiles.ActiveProfile = p3d Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MsgBox("プロファイルは既に " &amp;amp; p3d &amp;amp; " になっています。")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If ChProperty(p3d) Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ap.Profiles.ActiveProfile = p3d&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Else&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MsgBox(p3d &amp;amp; " というプロファイルがありません。")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Sub&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' 指定したプロファイルが存在するかどうかを確認する関数&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Public Function ChProperty(ByVal pName As String)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ap As AcadPreferences = Application.Preferences&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' 存在するプロパティの取得&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim Profiles As Object = Nothing&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ap.Profiles.GetAllProfileNames(Profiles)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For Each pr In Profiles&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' もし、指定したプロファイルが存在すれば、True を返す&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If pr.ToString = pName Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return True&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Next&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return False&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Function&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;End Class&lt;br /&gt;End Namespace&lt;br /&gt;-------------------------------------------------&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-3135677792910457061?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/3135677792910457061/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2011/02/net-autocad-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3135677792910457061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3135677792910457061'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2011/02/net-autocad-2011.html' title='.NET でプロファイルを変更する（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-VEZIC7K5VU/TUp30fi4r_I/AAAAAAAAATo/8cblctcIg9w/s72-c/Profile.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-3487689125515467759</id><published>2011-01-31T16:23:00.001+09:00</published><updated>2011-02-01T17:52:00.103+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>CUIx ファイルを使わずにリボンにボタンを追加する（AutoCAD 2011）</title><content type='html'>&lt;iframe allowtransparency="true" frameborder="0" scrolling="no" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Facadvideo-programing.blogspot.com%2F2011%2F01%2Fcuix-autocad-2011.html&amp;amp;layout=standard&amp;amp;show_faces=false&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=35" style="border: none; height: 35px; overflow: hidden; width: 450px;"&gt;&lt;/iframe&gt;&lt;br /&gt;いろいろググッてみたりして、リボンにボタンを追加できないかやってみました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;通常の操作では、CUI[ユーザ インタフェースをカスタマイズ] コマンドを実行して、CUIx ファイルをカスタマイズすると思うんですが、今回は CUIx ファイルを使わずに .NET でボタンの設定ができないかやってみました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;試してみたコードはこんな感じです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;' ------------------------------------------------------------&lt;br /&gt;Imports System&lt;br /&gt;Imports System.Windows&lt;br /&gt;Imports System.Windows.Media&lt;br /&gt;Imports System.Windows.Media.Imaging&lt;br /&gt;Imports Autodesk.AutoCAD.Runtime&lt;br /&gt;Imports Autodesk.AutoCAD.ApplicationServices&lt;br /&gt;Imports Autodesk.AutoCAD.DatabaseServices&lt;br /&gt;Imports Autodesk.AutoCAD.Geometry&lt;br /&gt;Imports Autodesk.AutoCAD.EditorInput&lt;br /&gt;Imports Autodesk.Windows&lt;br /&gt;Imports Autodesk.AutoCAD.Ribbon.RibbonServices&lt;br /&gt;&lt;br /&gt;' This line is not mandatory, but improves loading performances&lt;br /&gt;&amp;lt;Assembly: CommandClass(GetType(AVDO_RibbonSample.MyCommands))&amp;gt;&lt;br /&gt;&lt;br /&gt;Namespace AVDO_RibbonSample&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Public Class MyCommands&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;CommandMethod("AVDO_RibbonSample", "AVDO_RibbonSample", "AVDO_RibbonSample", CommandFlags.Modal)&amp;gt; _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Public Sub AVDO_RibbonSample()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ribCtrl As RibbonControl = RibbonPaletteSet.RibbonControl&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' リボンにタブを追加&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ribTab As New RibbonTab&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribTab.Title = "テスト"&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribTab.Id = "ID_TEST" &amp;nbsp; &amp;nbsp; &amp;nbsp; ' ID を設定しないと、AutoCAD を終了するときにエラーが発生してしまう。&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribCtrl.Tabs.Add(ribTab)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' パネルを作成&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ribSourcePanel As New Autodesk.Windows.RibbonPanelSource&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribSourcePanel.Title = "テスト パネル"&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ribPanel As New RibbonPanel&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribPanel.Source = ribSourcePanel&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribTab.Panels.Add(ribPanel)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' ボタン1を作成&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ribButton1 As New RibbonButton&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim bi1 As New BitmapImage()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bi1.BeginInit()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bi1.UriSource = New Uri("c:/temp/acadvideo16.jpg", UriKind.RelativeOrAbsolute)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bi1.EndInit()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribButton1.Image = bi1&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribButton1.Text = "テスト 線分"&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribButton1.ShowText = True&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribButton1.Description = "テスト用のボタンのひとつ目です"&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribButton1.CommandParameter = Chr(27) &amp;amp; Chr(27) &amp;amp; "_LINE "&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribButton1.CommandHandler = New AdskCommandHandler&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' ボタン2を作成&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ribButton2 As New RibbonButton&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim bi2 As New BitmapImage()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bi2.BeginInit()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bi2.UriSource = New Uri("c:/temp/acadvideo32.jpg", UriKind.RelativeOrAbsolute)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bi2.EndInit()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribButton2.LargeImage = bi2&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribButton2.Size = RibbonItemSize.Large&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribButton2.Text = "テスト 円"&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribButton2.ShowText = True&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribButton2.Description = "テスト用のボタンのふたつ目です"&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribButton2.CommandParameter = Chr(27) &amp;amp; Chr(27) &amp;amp; "_CIRCLE "&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribButton2.CommandHandler = New AdskCommandHandler&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' ボタンを追加&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribSourcePanel.Items.Add(ribButton1)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribSourcePanel.Items.Add(New RibbonRowBreak())&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ribSourcePanel.Items.Add(ribButton2)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Sub&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Public Class AdskCommandHandler&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Implements System.Windows.Input.ICommand&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Public Function CanExecute(ByVal parameter As Object) As Boolean Implements System.Windows.Input.ICommand.CanExecute&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return True&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Function&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Public Event CanExecuteChanged(ByVal sender As Object, ByVal e As System.EventArgs) Implements System.Windows.Input.ICommand.CanExecuteChanged&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Public Sub Execute(ByVal parameter As Object) Implements System.Windows.Input.ICommand.Execute&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'is from a Ribbon Button?&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ribBtn As RibbonButton = TryCast(parameter, RibbonButton)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If ribBtn IsNot Nothing Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.SendStringToExecute(DirectCast(ribBtn.CommandParameter, [String]), True, False, True)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'is from s Ribbon Textbox?&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ribTxt As RibbonTextBox = TryCast(parameter, RibbonTextBox)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If ribTxt IsNot Nothing Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MsgBox(ribTxt.TextValue)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Sub&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Class&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;End Class&lt;br /&gt;&lt;br /&gt;End Namespace&lt;br /&gt;' ------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;AVDO_RibbonSample コマンドを実行すると、リボンに［テスト］が追加されて、その中に［テスト パネル］ができて、［テスト 線分］と［テスト 円］というボタンが追加されました。&lt;br /&gt;&lt;br /&gt;※ c:/temp フォルダに、16X16 のイメージファイル&amp;nbsp;acadvideo16.jpg と 32x32 のイメージファイル&amp;nbsp;acadvideo32.jpg を置いています。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-3487689125515467759?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/3487689125515467759/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2011/01/cuix-autocad-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3487689125515467759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3487689125515467759'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2011/01/cuix-autocad-2011.html' title='CUIx ファイルを使わずにリボンにボタンを追加する（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-1099541811225773207</id><published>2011-01-07T12:48:00.003+09:00</published><updated>2011-01-08T11:16:24.914+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET - DLL ファイルを一度だけ手動でロードし、次回から自動的にロードされるようにする便利な方法（AutoCAD 2011）</title><content type='html'>&lt;iframe allowtransparency="true" frameborder="0" scrolling="no" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Facadvideo-programing.blogspot.com%2F2011%2F01%2Fnet-dll-autocad-2011_07.html&amp;amp;layout=standard&amp;amp;show_faces=false&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=35" style="border: none; height: 35px; overflow: hidden; width: 450px;"&gt;&lt;/iframe&gt;&lt;br /&gt;今までいくつかこのブログで .NET で作成したツール（.DLL ファイル）を掲載してました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;それを使う時って、毎回 NETLOAD コマンドでロードするか、acad.lsp を編集して自動的にロードするようにしなきゃいけないですよね。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;で、それって面倒ですよね。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;以前の &lt;a href="http://acadvideo-programing.blogspot.com/2010/10/net-dll-autocad-2011.html"&gt;.NET - DLL ファイルを自動的にロードする（AutoCAD 2011）&lt;/a&gt;&amp;nbsp;の中で、レジストリにデマンドロードの設定を追加すると、DLL ファイルを自動的にロードできるってことを紹介しました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;今日は、もっと便利な方法を Web で見つけたので、それを紹介したいと思います。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;それは、&lt;b&gt;一度だけ NETLOAD コマンドでロードすれば、レジストリに勝手に自動的にロードされる設定が追加さる&lt;/b&gt;っていう便利な方法です。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://through-the-interface.typepad.com/through_the_interface/2009/05/creating-demand-loading-entries-automatically-for-your-autocad-application-using-net.html"&gt;Creating demand-loading entries automatically for your AutoCAD application using .NET&lt;/a&gt;&amp;nbsp;に書いてあったんですが、C# のコードだったので、以下のように VB のコードにしてみました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;'----------------------------------------------------------&lt;br /&gt;Imports System&lt;br /&gt;Imports System.Collections.Generic&lt;br /&gt;Imports System.Reflection&lt;br /&gt;Imports System.Resources&lt;br /&gt;Imports Microsoft.Win32&lt;br /&gt;Imports Autodesk.AutoCAD.DatabaseServices&lt;br /&gt;Imports Autodesk.AutoCAD.Runtime&lt;br /&gt;&lt;br /&gt;Namespace DemandLoading&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Public Class RegistryUpdate&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Public Shared Sub RegisterForDemandLoading()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' Get the assembly, its name and location&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim assem As Assembly = Assembly.GetExecutingAssembly()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim name As String = assem.GetName().Name&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim path As String = assem.Location&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' We'll collect information on the commands&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' (we could have used a map or a more complex&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' container for the global and localized names&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' - the assumption is we will have an equal&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' number of each with possibly fewer groups)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim globCmds As New List(Of String)()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim locCmds As New List(Of String)()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim groups As New List(Of String)()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' Iterate through the modules in the assembly&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim mods As [Module]() = assem.GetModules(True)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For Each [mod] As [Module] In mods&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' Within each module, iterate through the types&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim types As Type() = [mod].GetTypes()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For Each type As Type In types&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' We may need to get a type's resources&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim rm As New ResourceManager(type.FullName, assem)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rm.IgnoreCase = True&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' Get each method on a type&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim meths As MethodInfo() = type.GetMethods()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For Each meth As MethodInfo In meths&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' Get the methods custom command attribute(s)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim attbs As Object() = meth.GetCustomAttributes(GetType(CommandMethodAttribute), True)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For Each attb As Object In attbs&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim cma As CommandMethodAttribute = TryCast(attb, CommandMethodAttribute)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If cma IsNot Nothing Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' And we can finally harvest the information&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' about each command&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim globName As String = cma.GlobalName&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim locName As String = globName&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim lid As String = cma.LocalizedNameId&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' If we have a localized command ID,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' let's look it up in our resources&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If lid IsNot Nothing Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' Let's put a try-catch block around this&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' Failure just means we use the global&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' name twice (the default)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;locName = rm.GetString(lid)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Catch&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' Add the information to our data structures&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;globCmds.Add(globName)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;locCmds.Add(locName)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If cma.GroupName IsNot Nothing AndAlso Not groups.Contains(cma.GroupName) Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;groups.Add(cma.GroupName)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Next&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Next&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Next&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Next&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' Let's register the application to load on demand (12)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' if it contains commands, otherwise we will have it&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' load on AutoCAD startup (2)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim flags As Integer = (If(globCmds.Count &amp;gt; 0, 12, 2))&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' By default let's create the commands in HKCU&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' (pass false if we want to create in HKLM)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CreateDemandLoadingEntries(name, path, globCmds, locCmds, groups, flags, True)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Sub&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Public Shared Sub UnregisterForDemandLoading()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RemoveDemandLoadingEntries(True)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Sub&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' Helper functions&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Private Shared Sub CreateDemandLoadingEntries(ByVal name As String, ByVal path As String, ByVal globCmds As List(Of String), ByVal locCmds As List(Of String), ByVal groups As List(Of String), ByVal flags As Integer, _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ByVal currentUser As Boolean)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' Choose a Registry hive based on the function input&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim hive As RegistryKey = (If(currentUser, Registry.CurrentUser, Registry.LocalMachine))&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' Open the main AutoCAD (or vertical) and "Applications" keys&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ack As RegistryKey = hive.OpenSubKey(HostApplicationServices.Current.RegistryProductRootKey, True)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Using ack&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim appk As RegistryKey = ack.CreateSubKey("Applications")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Using appk&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' Already registered? Just return&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim subKeys As String() = appk.GetSubKeyNames()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For Each subKey As String In subKeys&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If subKey.Equals(name) Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Next&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' Create the our application's root key and its values&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim rk As RegistryKey = appk.CreateSubKey(name)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Using rk&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rk.SetValue("DESCRIPTION", name, RegistryValueKind.[String])&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rk.SetValue("LOADCTRLS", flags, RegistryValueKind.DWord)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rk.SetValue("LOADER", path, RegistryValueKind.[String])&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rk.SetValue("MANAGED", 1, RegistryValueKind.DWord)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' Create a subkey if there are any commands...&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If (globCmds.Count = locCmds.Count) AndAlso globCmds.Count &amp;gt; 0 Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ck As RegistryKey = rk.CreateSubKey("Commands")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Using ck&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For i As Integer = 0 To globCmds.Count - 1&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ck.SetValue(globCmds(i), locCmds(i), RegistryValueKind.[String])&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Next&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Using&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' And the command groups, if there are any&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If groups.Count &amp;gt; 0 Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim gk As RegistryKey = rk.CreateSubKey("Groups")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Using gk&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For Each grpName As String In groups&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;gk.SetValue(grpName, grpName, RegistryValueKind.[String])&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Next&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Using&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Using&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Using&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Using&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Sub&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Private Shared Sub RemoveDemandLoadingEntries(ByVal currentUser As Boolean)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' Choose a Registry hive based on the function input&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim hive As RegistryKey = (If(currentUser, Registry.CurrentUser, Registry.LocalMachine))&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' Open the main AutoCAD (vertical) and "Applications" keys&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ack As RegistryKey = hive.OpenSubKey(HostApplicationServices.Current.RegistryProductRootKey)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Using ack&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim appk As RegistryKey = ack.OpenSubKey("Applications", True)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Using appk&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' Delete the key with the same name as this assembly&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;appk.DeleteSubKeyTree(Assembly.GetExecutingAssembly().GetName().Name)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Using&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Using&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Catch&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Sub&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;End Class&lt;br /&gt;End Namespace&lt;br /&gt;'----------------------------------------------------------&lt;br /&gt;&lt;br /&gt;RegisterForDemandLoading() を実行すると、レジストリに必要な記述が追加されます。&lt;br /&gt;なので、&lt;b&gt;myPlugin.vb の Initialize() 中で、RegisterForDemandLoading() を実行するようにしとけば OK です。&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;このとき、既定値では HKCU に追加されます。&lt;br /&gt;HKLM に追加したいときは、以下の部分を変更すればできます。&lt;br /&gt;&lt;br /&gt;CreateDemandLoadingEntries(name, path, globCmds, locCmds, groups, flags, &lt;b&gt;True&lt;/b&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ↓&lt;br /&gt;CreateDemandLoadingEntries(name, path, globCmds, locCmds, groups, flags, &lt;b&gt;False&lt;/b&gt;)&lt;br /&gt;&lt;br /&gt;ただ、管理者権限で AutoCAD を起動していないと&amp;nbsp;HKLM に追加できないので、既定値の&amp;nbsp;HKCU に追加するのがいいんじゃないかと思います。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;また、レジストリに追加された内容を削除したいときは、UnregisterForDemandLoading() を実行すると、削除されます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-1099541811225773207?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/1099541811225773207/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2011/01/net-dll-autocad-2011_07.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/1099541811225773207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/1099541811225773207'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2011/01/net-dll-autocad-2011_07.html' title='.NET - DLL ファイルを一度だけ手動でロードし、次回から自動的にロードされるようにする便利な方法（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-3308133908398247583</id><published>2010-12-28T16:41:00.000+09:00</published><updated>2011-01-05T20:13:09.050+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET - 2 つの図面のシステム変数の違いを見つける（AutoCAD 2011）</title><content type='html'>&lt;iframe allowtransparency="true" frameborder="0" scrolling="no" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.acadvideo.com%2F2010%2F12%2Fnet-2-autocad-2011.html&amp;amp;layout=standard&amp;amp;show_faces=false&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=35" style="border: none; height: 35px; overflow: hidden; width: 450px;"&gt;&lt;/iframe&gt;&lt;br /&gt;『なんでか他の図面では問題ないんだけど、この図面だけ動きがおかしいんだよね』 なんてときには、図面に保存されているシステム変数の値が原因ってことがあります。&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;そんな時には、問題ない図面とシステム変数を比較してみるのがいいと思います。&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;ということで、簡単に比較できるようなツールを .NET の勉強も兼ねて作ってみました。&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;以前、&lt;a href="http://blog.acadvideo.com/2010/07/autocad-2011.html"&gt;２つの図面のシステム変数の比較（AutoCAD 2011）&lt;/a&gt;&amp;nbsp;で、『.NET の ReadDwgFile メソッドを使用して、２つの図面のシステム変数の比較ができるかもと言ったのですが、チャレンジしてみたのですが、できませんでした。』って言ってたんですが、できました。&lt;br /&gt;&lt;br /&gt;システム変数を取得するには Application.GetSystemVariable メソッドを使うしかないと思ってたんですが、Database Properties にシステム変数があるってことに気が付きました。&lt;br /&gt;&lt;br /&gt;Database Properties にあるシステム変数をひとつずつ比較してみたので、結構時間がかかりましたが何とかできました。&lt;br /&gt;&lt;br /&gt;ただ、システム変数 SKPOLY に関しては、ちゃんと判断できないみたいです。&lt;br /&gt;というのは、SKPOLY には 0、1、2 のどれかの値が設定されるんですが、Database Properties では、True か False しか判断できないのです。&lt;br /&gt;なので、0 は　False で判断できるんですが、1 と 2 は両方とも True になっちゃうので、どちかわからないです。&lt;br /&gt;&lt;br /&gt;しょうがないので、今回のプログラムでは、True のときは、『1 or 2』 って表示されるようにしました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;DLL ファイルは &lt;a href="http://goo.gl/IdZ5p"&gt;ここ&lt;/a&gt; にあります。&lt;br /&gt;&lt;br /&gt;使い方とかは、動画を作ったので見てみてください。&lt;br /&gt;&lt;object height="340" width="560"&gt;&lt;param name="movie" value="http://www.youtube.com/v/q53UgpETzqU?fs=1&amp;amp;hl=ja_JP&amp;amp;rel=0&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/q53UgpETzqU?fs=1&amp;amp;hl=ja_JP&amp;amp;rel=0&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-3308133908398247583?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/3308133908398247583/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/12/net-2-autocad-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3308133908398247583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3308133908398247583'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/12/net-2-autocad-2011.html' title='.NET - 2 つの図面のシステム変数の違いを見つける（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-4894608927777084731</id><published>2010-12-20T12:46:00.000+09:00</published><updated>2011-01-05T20:13:09.056+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET - 寸法図形の寸法スタイルを変更する（AutoCAD 2011）</title><content type='html'>&lt;iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.acadvideo.com%2F2010%2F12%2Fnet-autocad-2011_20.html&amp;amp;layout=standard&amp;amp;show_faces=false&amp;amp;width=500&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=35" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:35px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;br /&gt;昨日は、現在の寸法スタイルを変更する方法でしたね。&lt;br /&gt;今日は、既に描かれている寸法図形を他の寸法スタイルに変更する方法を試してみたので、それを紹介したいと思います。&lt;br /&gt;&lt;br /&gt;例えば、選択した寸法図形の寸法スタイルを「ACAD Video」という寸法スタイルの変えたいときは、こんな感じでできました。&lt;br /&gt;&lt;br /&gt;'--------------------------------------------------------&lt;br /&gt;&amp;lt;CommandMethod("test", "test4", CommandFlags.Modal + CommandFlags.UsePickSet)&amp;gt; _&lt;br /&gt;Public Sub test4()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim doc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim db As Database = doc.Database&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim ed As Editor = doc.Editor&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Using trans As Transaction = db.TransactionManager.StartTransaction&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' PickFirst 選択セットを取得&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim psr As PromptSelectionResult = ed.SelectImplied()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' PickFirst 選択セットを取得できなかったときは、オブジェクトをオブジェクトを選択する&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If psr.Status &amp;lt;&amp;gt; PromptStatus.OK Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;psr = ed.GetSelection()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' 何も選択されていなかったら、コマンドを終了する&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If psr.Status &amp;lt;&amp;gt; PromptStatus.OK Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' ObjectIdCollection に選択したオブジェクトのオブジェクト ID を設定&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim objIdColl As New ObjectIdCollection(psr.Value.GetObjectIds())&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' 選択したそれぞれのオブジェクトに対して実行&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For Each objId As ObjectId In objIdColl&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' もし、寸法図形だったら、寸法スタイルを ACAD Vide に変更&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ent As Entity = trans.GetObject(objId, OpenMode.ForRead)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If TypeOf ent Is Dimension Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim d1 As Dimension = ent&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;d1.UpgradeOpen()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt;d1.DimensionStyleName = "ACAD Video"&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Next&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;trans.Commit()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Catch ex As Autodesk.AutoCAD.Runtime.Exception&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Application.ShowAlertDialog(ex.Message)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;End Using&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;'--------------------------------------------------------&lt;br /&gt;&lt;br /&gt;また、d1.DimensionStyleName = "ACAD Video" の代わりにこんな感じにしても OK でした。&lt;br /&gt;'--------------------------------------------------------&lt;br /&gt;Dim dimTbl As DimStyleTable = trans.GetObject(db.DimStyleTableId, OpenMode.ForRead)&lt;br /&gt;Dim dimTblRec As DimStyleTableRecord = trans.GetObject(dimTbl("ACAD Video"), OpenMode.ForRead)&lt;br /&gt;&lt;br /&gt;d1.DimensionStyle = dimTblRec.ObjectId&lt;br /&gt;'--------------------------------------------------------&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-4894608927777084731?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/4894608927777084731/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/12/net-autocad-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/4894608927777084731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/4894608927777084731'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/12/net-autocad-2011.html' title='.NET - 寸法図形の寸法スタイルを変更する（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-3337309926552283613</id><published>2010-12-19T12:39:00.000+09:00</published><updated>2011-01-05T20:13:09.060+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET - 現在の寸法スタイルを変更する／&lt;優先スタイル&gt; を破棄する（AutoCAD 2011）</title><content type='html'>&lt;iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.acadvideo.com%2F2010%2F12%2Fnet-autocad-2011_19.html&amp;amp;layout=standard&amp;amp;show_faces=false&amp;amp;width=500&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=35" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:35px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;br /&gt;今日は、.NET での寸法スタイルの変更についてです。&lt;br /&gt;&lt;br /&gt;先日、&amp;lt;優先スタイル&amp;gt; を破棄したいといった質問をいただきました。&lt;br /&gt;&lt;br /&gt;&amp;lt;優先スタイル&amp;gt; って知ってます？&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_-VEZIC7K5VU/TQ13q9gMfNI/AAAAAAAAATM/w7IESgDJaJU/s1600/override.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="226" src="http://3.bp.blogspot.com/_-VEZIC7K5VU/TQ13q9gMfNI/AAAAAAAAATM/w7IESgDJaJU/s400/override.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;例えば上の絵のように、現在の一部の設定（上の例では 「垂直方向の寸法値位置」（DIMTAD））が寸法スタイル（上の例では 「ACAD Video」）と違っているときに出てきます。&lt;br /&gt;&lt;br /&gt;これをなくしたいってことなんですが、以下のようにやってもなくならないといった内容です。&lt;br /&gt;&lt;blockquote&gt;db.Dimstyle = dimTblRec.ObjectId&lt;br /&gt;&lt;br /&gt;※ db は Database、dimTblRec は DimStyleTableRecord&lt;/blockquote&gt;確かに、これを実行しても&amp;nbsp;&amp;lt;優先スタイル&amp;gt; はなくなりませんでした。&lt;br /&gt;なんででしょう？？？&lt;br /&gt;&lt;br /&gt;いろいろ調べてみたんですが、&amp;lt;優先スタイル&amp;gt; ってどこにも覚えられていなみたいなんですよね。&lt;br /&gt;どこかに覚えられていればそれを消せばいいかと思ってたんですが、それがどこにもなさそうなので、諦めかけてたんですが、やっと見つけました。&lt;br /&gt;&lt;br /&gt;SetDimstyleData っていうのがあって、これを使うようです。&lt;br /&gt;具体的にはこんな感じです。&lt;br /&gt;'-----------------------------------------------------------------&lt;br /&gt;Dim doc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;Dim db As Database = doc.Database&lt;br /&gt;&lt;br /&gt;Using trans As Transaction = db.TransactionManager.StartTransaction&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim dimTbl As DimStyleTable = trans.GetObject(db.DimStyleTableId, OpenMode.ForRead)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim dimTblRec As DimStyleTableRecord = trans.GetObject(dimTbl("ACAD Video"), OpenMode.ForRead)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;db.Dimstyle = dimTblRec.ObjectId&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;db.SetDimstyleData(dimTblRec)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;trans.Commit()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Catch ex As Autodesk.AutoCAD.Runtime.Exception&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Application.ShowAlertDialog(ex.Message)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;End Try&lt;br /&gt;End Using&lt;br /&gt;'-----------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;現在の寸法スタイルを変更するときもこれと同じで OK です。&lt;br /&gt;（&amp;lt;優先スタイル&amp;gt; を破棄するときは、db.Dimstyle = dimTblRec.ObjectId がなくても OKです。）&lt;br /&gt;&lt;br /&gt;なんで&amp;nbsp;Dimstyle の設定だけではダメかというと、こういった理由になると思います。&lt;br /&gt;&lt;br /&gt;DIM* といった寸法に関するシステム変数は、現在のデータベースに設定されています。&lt;br /&gt;Dimstyle の設定を置き換えるように設定すると、現在の寸法スタイルは指定したものになりますが、他のシステム変数（例：DIMTAD など）は変わらずそのままです。&lt;br /&gt;なので、&amp;lt;優先スタイル&amp;gt; も残ったままになります。&lt;br /&gt;&lt;br /&gt;そのため、寸法スタイルの設定から、すべての DIM* というシステム変数を読み込む必要があります。&lt;br /&gt;それをするのが&amp;nbsp;SetDimstyleData ということです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-3337309926552283613?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/3337309926552283613/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/12/net-autocad-2011_19.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3337309926552283613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3337309926552283613'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/12/net-autocad-2011_19.html' title='.NET - 現在の寸法スタイルを変更する／&amp;lt;優先スタイル&amp;gt; を破棄する（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-VEZIC7K5VU/TQ13q9gMfNI/AAAAAAAAATM/w7IESgDJaJU/s72-c/override.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-3843118222643167082</id><published>2010-12-13T10:10:00.004+09:00</published><updated>2011-01-07T12:43:07.165+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET - コマンドをキーボードから簡単に実行（AutoCAD 2011）</title><content type='html'>&lt;iframe allowtransparency="true" frameborder="0" scrolling="no" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.acadvideo.com%2F2010%2F12%2Fnet-autocad-2011.html&amp;amp;layout=standard&amp;amp;show_faces=false&amp;amp;width=450&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;height=35" style="border: none; height: 35px; overflow: hidden; width: 450px;"&gt;&lt;/iframe&gt;&lt;br /&gt;コマンドを実行するとき、通常はリボンやツールボタンから実行すると思うのですが、キーボードからも実行できます。&lt;br /&gt;&lt;br /&gt;例えば、L と入力すると LINE[線分] コマンドが実行されたり、C と入力すると CIRCLE[円] コマンドが実行されたりします。&lt;br /&gt;よく使うコマンドをこのようにキーボードから簡単に実行できたら、ひょっとしたらリボンやツールボタンから実行するよりも早く実行することができるかもしれませんね。&lt;br /&gt;&lt;br /&gt;この L とか C というのは、コマンド エイリアスといって acad.pgp っているファイルで設定されています。&lt;br /&gt;&lt;br /&gt;この acad.pgp ファイルは、テキスト ファイルなので、メモ帳などで編集することもできます。（［管理］タブ－［エイリアス編集］をクリックすると、メモ帳で開かれます。）&lt;br /&gt;また、［Express Tools］タブ－［Command Aliases］ でも編集できます。&lt;br /&gt;&lt;br /&gt;でもちょっと面倒なので、もう少し簡単に変更するプログラムを .NET で作ってみました。&lt;br /&gt;（以前も &lt;a href="http://blog.acadvideo.com/2010/09/net-autocad-2011.html"&gt;http://blog.acadvideo.com/2010/09/net-autocad-2011.html&lt;/a&gt; で作ったのですが、あんまり使い勝手がよくなくて管理人自身も使わなくなってしまったので、改善してみました。）&lt;br /&gt;&lt;br /&gt;使い方としては、こんな感じです。&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://goo.gl/pTvXU"&gt;AVDO_SetAlias2.dll&lt;/a&gt; をダウンロードします。&lt;/li&gt;&lt;li&gt;NETLOAD コマンドを実行して、AVDO_SetAlias2.dll をロードします。&lt;br /&gt;（&lt;a href="http://blog.acadvideo.com/2010/10/net-dll-autocad-2011.html"&gt;http://blog.acadvideo.com/2010/10/net-dll-autocad-2011.html&lt;/a&gt; の方法を使えば、AutoCAD 起動時に勝手にロードしてくれます。）&lt;/li&gt;&lt;li&gt;AVDO_SetAlias2_Add コマンドを実行します。 &lt;br /&gt;図面を開くたびに実行する必要があります。acaddoc.lsp に&amp;nbsp;AVDO_SetAlias2_Add コマンドを実行するよう記述しておくと、図面を開いたときに勝手に実行してくれます。&lt;/li&gt;&lt;li&gt;コマンド エイリアスを設定したいコマンドを実行します。&lt;br /&gt;コマンドを完了 または キャンセルします。&lt;/li&gt;&lt;li&gt;AVDO_SetAlias2 コマンドを実行します。&lt;/li&gt;&lt;/ol&gt;※&amp;nbsp;&lt;a href="http://blog.acadvideo.com/2010/09/net-autocad-2011.html"&gt;http://blog.acadvideo.com/2010/09/net-autocad-2011.html&lt;/a&gt;&amp;nbsp;では対応していなかった&amp;nbsp;Express Tools の AutoLISP で作られたコマンドに対しても対応しました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;動画を作ってみたので見てみてください。&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;今回は、今までのように文字を入れるのではなく、しゃべってみました。&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;今回はじめてだったので、結構時間かかりましたが、慣れてくればしゃべった方が文字入れるより簡単かも。&lt;br /&gt;&lt;object height="340" width="560"&gt;&lt;param name="movie" value="http://www.youtube.com/v/rEZSoNW5VUM?fs=1&amp;amp;hl=ja_JP&amp;amp;rel=0&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/rEZSoNW5VUM?fs=1&amp;amp;hl=ja_JP&amp;amp;rel=0&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-3843118222643167082?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/3843118222643167082/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/12/net-autocad-2011_13.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3843118222643167082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3843118222643167082'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/12/net-autocad-2011_13.html' title='.NET - コマンドをキーボードから簡単に実行（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-9008803153056746396</id><published>2010-11-22T18:25:00.000+09:00</published><updated>2011-01-05T20:13:09.068+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET - 図面が保存されることを認識する方法（AutoCAD 2011）</title><content type='html'>以前いただいていた .NET の質問があったのですが、AUJ などがあってそのままにしていたのですが、AUJ も終わったので今日はそのことについて調べてみました。&lt;br /&gt;&lt;br /&gt;内容としては、SAVE コマンドでの保存、上書き保存、図面 CLOSE 時の保存、VBA の SAVE メソッドでの保存 など図面が保存されることを認識したいということでした。&lt;br /&gt;&lt;br /&gt;Document.CloseWillStart Event でコマンド名が SAVE のときに処理するようにしてみたところ、図面 CLOSE 時の保存、VBA の SAVE メソッドでの保存 では認識してくれないということでした。&lt;br /&gt;&lt;br /&gt;試してみたところ、確かに&amp;nbsp;CommandWillStart では&amp;nbsp;図面 CLOSE 時の保存、VBA の SAVE メソッドでの保存 は認識してくれませんでした。&lt;br /&gt;どうやら、その時は何のコマンドも動いていないみたい（AutoCAD 内部の機能で保存されている？）で、そのために認識することが出来ていないようです。&lt;br /&gt;&lt;br /&gt;ということで、何かないかなーと思って&amp;nbsp;arxmgd.chm を眺めていたら、&lt;b&gt;Database.BeginSave&lt;/b&gt; Event っていうのを見つけました。きっとこれだと思って試してみたところ、図面 CLOSE 時の保存、VBA の SAVE メソッドでの保存 でもちゃんと認識してくれました。&lt;br /&gt;&lt;br /&gt;試してみたときのコードはこんな感じです。&lt;br /&gt;&lt;br /&gt;'------------------------------------------------&lt;br /&gt;' AddHandler を実行したことがあるかどうかの判断用の変数&lt;br /&gt;Dim jHandler As Boolean = False&lt;br /&gt;&lt;br /&gt;' イベントを登録するコマンド&lt;br /&gt;&amp;lt;CommandMethod("AVDO_BeginSave", "AVDO_BeginSave", "AVDO_BeginSave", CommandFlags.Modal)&amp;gt; _&lt;br /&gt;Public Sub AVDO_BeginSave()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim doc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim db As Database = doc.Database&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;' AddHandler を複数回実行すると正しく動作しないため、実行されているかどうかを判断する。&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;If jHandler = False Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AddHandler db.BeginSave, New DatabaseIOEventHandler(AddressOf BeginSave)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jHandler = True&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;' Save が開始されたときに実行する関数&lt;br /&gt;Public Sub BeginSave(ByVal sender As Object, ByVal e As DatabaseIOEventArgs)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;MsgBox("保存が始まったよ!!")&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;'------------------------------------------------&lt;br /&gt;&lt;br /&gt;AVDO_BeginSave コマンドを実行するとイベントが登録されます。&lt;br /&gt;それぞれの図面で実行しておく必要があるようなので、acaddoc.lsp に&amp;nbsp;AVDO_BeginSave&amp;nbsp;コマンドを実行するように記述しておけばいいと思います。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-9008803153056746396?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/9008803153056746396/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/11/net-autocad-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/9008803153056746396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/9008803153056746396'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/11/net-autocad-2011.html' title='.NET - 図面が保存されることを認識する方法（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-3992601068560731867</id><published>2010-11-15T10:23:00.000+09:00</published><updated>2011-01-05T20:13:09.072+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET - ラバーバンドを表示して 2 点目を指定する（AutoCAD 2011）</title><content type='html'>今日も .NET 質問いただいたことについて書こうと思います。&lt;br /&gt;&lt;br /&gt;例えば、左下点と右上点をクリックして範囲を指定する（クリックした左下点と右上点の座標値を取得する）ときにラバーバンドを表示したいっといった内容です。&lt;br /&gt;&lt;br /&gt;こんなとき、下の絵のようにラバーバンドが出てくれないと、この範囲を指定してますって感じに見えないですよね。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_-VEZIC7K5VU/TOCJMPzc-MI/AAAAAAAAAS4/OfjvaQCfI8o/s1600/%25E3%2583%25A9%25E3%2583%2590%25E3%2583%25BC%25E3%2583%2590%25E3%2583%25B3%25E3%2583%2589.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="235" src="http://1.bp.blogspot.com/_-VEZIC7K5VU/TOCJMPzc-MI/AAAAAAAAAS4/OfjvaQCfI8o/s400/%25E3%2583%25A9%25E3%2583%2590%25E3%2583%25BC%25E3%2583%2590%25E3%2583%25B3%25E3%2583%2589.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;GetCorner メソッドを使えば、2 点目を指定するときにラバーバンドが出てきます。&lt;br /&gt;&lt;br /&gt;管理人が確認したコードは、こんな感じです。&lt;br /&gt;&lt;br /&gt;'--------------------------------------&lt;br /&gt;Dim doc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;Dim ed As Editor = doc.Editor&lt;br /&gt;&lt;br /&gt;Dim ppo As New PromptPointOptions("1点目を指定")&lt;br /&gt;ppo.AllowNone = False&lt;br /&gt;&lt;br /&gt;Dim ppr As PromptPointResult = ed.GetPoint(ppo)&lt;br /&gt;&lt;br /&gt;If ppr.Status &amp;lt;&amp;gt; PromptStatus.OK Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Return&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;Dim pt1 As Point3d = ppr.Value&lt;br /&gt;&lt;br /&gt;Dim pco As New PromptCornerOptions(vbLf &amp;amp; "2点目を指定", pt1)&lt;br /&gt;ppr = ed.GetCorner(pco)&lt;br /&gt;&lt;br /&gt;If ppr.Status &amp;lt;&amp;gt; PromptStatus.OK Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Return&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;Dim pt2 As Point3d = ppr.Value&lt;br /&gt;&lt;br /&gt;MsgBox("1点目：" &amp;amp; pt1.ToString &amp;amp; vbLf &amp;amp; "2点目：" &amp;amp; pt2.ToString)&lt;br /&gt;'--------------------------------------&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-3992601068560731867?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/3992601068560731867/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/11/net-2-autocad-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3992601068560731867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3992601068560731867'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/11/net-2-autocad-2011.html' title='.NET - ラバーバンドを表示して 2 点目を指定する（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-VEZIC7K5VU/TOCJMPzc-MI/AAAAAAAAAS4/OfjvaQCfI8o/s72-c/%25E3%2583%25A9%25E3%2583%2590%25E3%2583%25BC%25E3%2583%2590%25E3%2583%25B3%25E3%2583%2589.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-1430538518752127777</id><published>2010-11-12T12:18:00.000+09:00</published><updated>2011-01-05T20:13:09.079+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET -  WMF ファイルに書き出す（AutoCAD 2011）</title><content type='html'>先日いただいたアンケートで、SendStringToExecute 以外の方法で&amp;nbsp;WMF ファイルに書き出したいというものをいただきました。&lt;br /&gt;&lt;br /&gt;VBA では、（ThisDrawing.Export fName, ""WMF"", sset） とやってできてたそうです。（管理人は、VBA はやったことないので勉強になりました。）&lt;br /&gt;&lt;br /&gt;ということで、ググッてみたところ、ひとつ方法を見つけました。&lt;br /&gt;実際に試してみたところ、WMF ファイルに書き出すことができました。&lt;br /&gt;&lt;br /&gt;WMF 以外にも EXPORT コマンドで書き出せるファイルはできるんじゃないかと思います。&lt;br /&gt;&lt;br /&gt;ただ、GetObject を使っているので、AutoCAD が複数起動しているときは、必ず最初に起動した AutoCAD が認識されちゃいます。&lt;br /&gt;そのため、あとから起動した AutoCAD 上で実行しても、最初に起動した AutoCAD で開いている図面が WMF に書き出されちゃうので注意が必要です。&lt;br /&gt;何かいい方法はないのかなと思いつつも見つけ出せないでいます。もし、何かご存じの方がいて教えてくれたら嬉しいです。&lt;br /&gt;&lt;br /&gt;試してみたコードは以下のような感じです。&lt;br /&gt;（プロジェクトを作るときに、「AutoCAD Interop Common」 と 「AutoCAD Interop」 にチェックを入れて、Imports Autodesk.AutoCAD.Interop と Imports Autodesk.AutoCAD.Interop.Common を追記しました。）&lt;br /&gt;&lt;br /&gt;'----------------------------------------------------------------------------&lt;br /&gt;Public Sub AVDO_ExportWMF()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim acadApp As Autodesk.AutoCAD.Interop.AcadApplication&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim acadDoc As Autodesk.AutoCAD.Interop.AcadDocument&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim ssetObj As AcadSelectionSet = Nothing&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;' 起動している AutoCAD のインスタンスを読み込む（AutoCAD が複数起動しているときは、最初に起動した AutoCAD で実行されるので注意！！）&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;acadApp = GetObject(, "AutoCAD.Application.18.1")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;acadDoc = acadApp.ActiveDocument&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' セレクションセットの作成&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ssetObj = acadDoc.SelectionSets.Add("AVDO_SSET01")&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' すべてのオブジェクトをセレクションセットに入れる&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ssetObj.Select(AcSelect.acSelectionSetAll) &amp;nbsp; &amp;nbsp;'puts everything into the selection set object&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' WMF ファイルに書き出し&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acadDoc.Export("C:\Temp\test", "wmf", ssetObj)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Catch ex As System.Exception&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Application.ShowAlertDialog(ex.Message)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Finally&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' ssetObj を削除（これをやっておかないと、2回目からエラーになってしまう。）&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ssetObj.Delete()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;End Try&lt;br /&gt;End Sub&lt;br /&gt;'----------------------------------------------------------------------------&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-1430538518752127777?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/1430538518752127777/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/11/net-wmf-autocad-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/1430538518752127777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/1430538518752127777'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/11/net-wmf-autocad-2011.html' title='.NET -  WMF ファイルに書き出す（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-4439910168102959927</id><published>2010-11-06T21:29:00.000+09:00</published><updated>2011-01-05T20:13:09.082+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET（サンプル プログラム） - 「ハッチングの境界をまとめて選択」（AutoCAD 2011）</title><content type='html'>先日いただいたアンケートの中に、『ハッチングの境界だけをまとめて選択したい』 というものがありました。&lt;br /&gt;&lt;br /&gt;普通のコマンドでは、そのようなことはできないと思うので、.NET でコマンドをひとつ作ってみました。&lt;br /&gt;&lt;br /&gt;DLL ファイル（AVDO_SelectBoundaries.dll）は &lt;a href="http://goo.gl/tXCgj"&gt;こちら&lt;/a&gt; です。&lt;br /&gt;&lt;br /&gt;使い方は、こんな感じです。&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;NETLOAD コマンドを実行して、AVDO_SelectBoundaries.dll をロードします。&lt;/li&gt;&lt;li&gt;AVDO_SelectBoundaries コマンドを実行します。&lt;/li&gt;&lt;li&gt;ハッチングの境界を探す対象の図形を選択します。（すべての図形を対象とするときは、ALL と入力します。）&lt;/li&gt;&lt;li&gt;Enter キーを押して、選択を完了します。&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;すると、ハッチングの境界だけが選択された状態になります。&lt;br /&gt;&lt;br /&gt;※ PICKFIRST にも対応しているので、図形を選択したあとに&amp;nbsp;AVDO_SelectBoundaries コマンドを実行しても OK です。&lt;br /&gt;※ 自動調整ハッチングの境界を探しているので、自動調整でないハッチングの境界は対象外です。&lt;br /&gt;&lt;br /&gt;動画も作りましたので、見てみてください。&lt;br /&gt;&lt;object height="340" width="560"&gt;&lt;param name="movie" value="http://www.youtube.com/v/BGXqzw5oqXA?fs=1&amp;amp;hl=ja_JP&amp;amp;rel=0&amp;amp;hd=1&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/BGXqzw5oqXA?fs=1&amp;amp;hl=ja_JP&amp;amp;rel=0&amp;amp;hd=1&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;ハッチングの境界を見つける方法は比較的簡単に分かったんですが、コマンド終了後に境界が選択された状態にしておく方法がなかなか見つけられなくて苦労しました。&lt;br /&gt;&lt;br /&gt;SetImpliedSelection っていうのでできるっていうのをググッて見つけたんですが、arxmgd.chm にはそれが載ってないんですよね。それなのに、みんななんで知ってるんでしょうね。&lt;br /&gt;&lt;br /&gt;また、SetImpliedSelection がうまく動かなかったときに、Twitter で&amp;nbsp;&lt;a href="http://goo.gl/2reQs" target="_blank"&gt;takamoda&lt;/a&gt; さんや&amp;nbsp;&lt;a href="http://goo.gl/JuRJ2" target="_blank"&gt;u2suzuki&lt;/a&gt; さんに助言いただき助かりました。どうもありがとうございました。&lt;br /&gt;&lt;br /&gt;ということで、コードはこんな感じです。&lt;br /&gt;&lt;br /&gt;'-----------------------------------------------&lt;br /&gt;' CommandFlags.Redraw の記述がないと、コマンド終了後に図形が選択された状態にならないので、必ず付けること！！&lt;br /&gt;&amp;lt;CommandMethod("AVDO_SelectBoundaries", "AVDO_SelectBoundaries", CommandFlags.Modal + CommandFlags.Redraw)&amp;gt; _&lt;br /&gt;Public Sub AVDO_SelectBoundaries()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim doc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim db As Database = doc.Database&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim ed As Editor = doc.Editor&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;' コマンド実行時に選択されている図形設定&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim result As PromptSelectionResult = ed.SelectImplied()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;' コマンド実行時に、図形が選択されていないときは、図形を選択するよう要求&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;If (result.Status &amp;lt;&amp;gt; PromptStatus.OK) Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = ed.GetSelection()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;' 図形が選択されているときは以下を実行する&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;If (result.Status = PromptStatus.OK) Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Using trans As Transaction = db.TransactionManager.StartTransaction&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim bt As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForRead)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim btRec As BlockTableRecord&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim cSpace As BlockTableRecord = trans.GetObject(db.CurrentSpaceId, OpenMode.ForRead)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If cSpace.Name = "*Model_Space" Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;btRec = trans.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Else&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;btRec = trans.GetObject(bt(BlockTableRecord.PaperSpace), OpenMode.ForWrite)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'ハッチング境界用のコレクション&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim bObjIdColl As New ObjectIdCollection&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For Each selObj As SelectedObject In result.Value&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ent As Entity = trans.GetObject(selObj.ObjectId, OpenMode.ForRead)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim objIdColl As ObjectIdCollection = ent.GetPersistentReactorIds&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For Each objId As ObjectId In objIdColl&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim dbObj As DBObject = trans.GetObject(objId, OpenMode.ForRead)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'もし、リアクターのタイプが Hatch だったら、コレクションに追加&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If TypeOf dbObj Is Hatch Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bObjIdColl.Add(selObj.ObjectId)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Next&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Next&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' pickfirst set をクリア&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ed.SetImpliedSelection(New ObjectId(-1) {})&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' コレクションを配列にダンプ&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ids As ObjectId() = New ObjectId(bObjIdColl.Count - 1) {}&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bObjIdColl.CopyTo(ids, 0)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' pickfirst set を設定&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ed.SetImpliedSelection(ids)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Catch ex As Autodesk.AutoCAD.Runtime.Exception&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Application.ShowAlertDialog(ex.Message)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Using&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;End If&lt;br /&gt;End Sub&lt;br /&gt;'-----------------------------------------------&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-4439910168102959927?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/4439910168102959927/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/11/net-autocad-2011_06.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/4439910168102959927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/4439910168102959927'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/11/net-autocad-2011_06.html' title='.NET（サンプル プログラム） - 「ハッチングの境界をまとめて選択」（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-7399883151107511954</id><published>2010-10-27T15:48:00.000+09:00</published><updated>2011-01-05T20:13:09.087+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET - 文字列の長さを取得する（AutoCAD 2011）</title><content type='html'>今日もアンケートでいただいた .NET の質問についてです。&lt;br /&gt;&lt;br /&gt;いただいた質問は、文字列の長さを取得する方法は？ というものです。&lt;br /&gt;確かに、文字によって文字幅が異なってくるので、文字数を元に求められないですよね。&lt;br /&gt;例えば、同じ 5 文字でも 『iiiii』 と 『WWWWW』 では文字幅違いますし、同じ文字でもフォントによって違いますよね。&lt;br /&gt;&lt;br /&gt;ということで、探してみました。&lt;br /&gt;最初は AutoLISP に textbox って関数があるので、それと同じようなものはないかなってことで&amp;nbsp;arxmgd.chm で&amp;nbsp;textbox を探してみたんですが、何も出てきません。&lt;br /&gt;じゃあ、オブジェクトの境界を取得することとかできないかなと思って探してみたら、Entity Properties に GeometricExtents っていうのがありました。&lt;br /&gt;&lt;br /&gt;早速それを使ってやってみたらオブジェクトの境界を取得できました。&lt;br /&gt;境界が取得できれば、それから文字列の長さってわかりますよね。（普通は X 方向の値。90°回転しているときは Y 方向の値。それ以外の角度で回転しているときは計算しなきゃいけない。）&lt;br /&gt;&lt;br /&gt;試してみた時のコードは、こんな感じです。&lt;br /&gt;&lt;br /&gt;'--------------------------------------------------&lt;br /&gt;Dim doc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;Dim db As Database = doc.Database&lt;br /&gt;&lt;br /&gt;Using trans As Transaction = db.TransactionManager.StartTransaction&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ed As Editor = doc.Editor&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim selEntID As ObjectId = ed.GetEntity("オブジェクトを選択").ObjectId&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ent As Entity = trans.GetObject(selEntID, OpenMode.ForRead)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim minX As Double = ent.GeometricExtents.MinPoint.X&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim minY As Double = ent.GeometricExtents.MinPoint.Y&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim maxX As Double = ent.GeometricExtents.MaxPoint.X&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim maxY As Double = ent.GeometricExtents.MaxPoint.Y&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MsgBox("選択したオブジェクトの境界は、X = " &amp;amp; (maxX - minX) &amp;amp; "、Y = " &amp;amp; (maxY - minY) &amp;amp; " です。")&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Catch ex As Autodesk.AutoCAD.Runtime.Exception&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Application.ShowAlertDialog(ex.Message)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;End Try&lt;br /&gt;End Using&lt;br /&gt;'--------------------------------------------------&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-7399883151107511954?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/7399883151107511954/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/10/net-autocad-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/7399883151107511954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/7399883151107511954'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/10/net-autocad-2011.html' title='.NET - 文字列の長さを取得する（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-4850026997870693170</id><published>2010-10-25T17:48:00.000+09:00</published><updated>2011-01-05T20:13:09.095+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET - DLL ファイルを自動的にロードする（AutoCAD 2011）</title><content type='html'>先日いただいたアンケートで、.NET を自動的にロードする方法の質問があったので、今日はそれについて書こうと思います。&lt;br /&gt;&lt;br /&gt;手動では、NETLOAD コマンドを実行して .DLL ファイルをロードすると、.NET で作成したコマンドが使用できるようになります。&lt;br /&gt;&lt;br /&gt;ただし、これだと AutoCAD を起動する度に実行しなきゃいけないので、面倒ですよね。&lt;br /&gt;&lt;br /&gt;そこで、勝手にロードされる方法としては、以下のような方法があります。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;【acad.lsp でロードする】&lt;/b&gt;&lt;br /&gt;acad.lsp に以下の記述を追加しておくと、AutoCAD 起動時に自動的にロードされます。&lt;br /&gt;（例として、AVDO_Point.dll をロードする内容にしています。）&lt;br /&gt;&lt;br /&gt;;---------------------------------------------------&lt;br /&gt;(defun-q MYSTARTUP ()&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;(command "NETLOAD" "AVDO_Point.dll")&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;(princ)&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;(setq S::STARTUP (append S::STARTUP MYSTARTUP))&lt;br /&gt;;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;acad.lsp がどこにあるかは、コマンド ラインに (findfile "acad.lsp") と入力すると確認できます。&lt;br /&gt;&lt;br /&gt;そのとき nil が返ってきたら、acad.lsp がないということなので、メモ帳などで新たに作ってサポート ファイルの検索パスにあるどこかのフォルダに置いてください。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;【レジストリにデマンドロードの設定を追加する】&lt;/b&gt;&lt;br /&gt;これは、.NET で作ったアプリケーションをインストーラでインストールするときに、設定しておくときに使えばいいんじゃないかと思います。&lt;br /&gt;&lt;br /&gt;でも、reg ファイルを作って手動でレジストリに追加するってこともできます。&lt;br /&gt;&lt;br /&gt;reg ファイルの例としては、以下のとおりです。&lt;br /&gt;&lt;br /&gt;;---------------------------------------------------&lt;br /&gt;Windows Registry Editor Version 5.00&lt;br /&gt;&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R18.1\ACAD-9001:411\Applications\AVDO_Point]&lt;br /&gt;"DESCRIPTION"="ACAD Video"&lt;br /&gt;"LOADER"="C:\\Program Files\\Autodesk\\AutoCAD 2011\\acadvideo\\AVDO_Point.dll"&lt;br /&gt;"LOADCTRLS"=dword:00000002&lt;br /&gt;"MANAGED"=dword:00000001&lt;br /&gt;&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R18.1\ACAD-9001:411\Applications\AVDO_Point\Commands]&lt;br /&gt;"AVDO_DDPTYPE"="AVDO_DDPTYPE"&lt;br /&gt;"AVDO_Point"="AVDO_Point"&lt;br /&gt;"AVDO_POINT_EVENT"="AVDO_POINT_EVENT"&lt;br /&gt;"AVDO_POINT_EVENT_REMOVE"="AVDO_POINT_EVENT_REMOVE"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R18.1\ACAD-9001:411\Applications\AVDO_Point\Groups]&lt;br /&gt;"AVDO_Point"="AVDO_Point"&lt;br /&gt;&lt;div&gt;;---------------------------------------------------&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"LOADER"="C:\\Program Files\\Autodesk\\AutoCAD 2011\\acadvideo\\AVDO_Point.dll" のとことでロードする .DLL ファイルを指定しています。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"LOADCTRLS"=dword:00000004 のところで、どんなときにロードするかを指定しています。&lt;/div&gt;&lt;div&gt;dword:00000002 は、AutoCAD 起動時にロードするということです。&lt;/div&gt;&lt;div&gt;dword:00000004&amp;nbsp;は、コマンド実行時にロードするということです。ロードするものがいっぱいあって、AutoCAD の起動が遅い時とかはこれにしておく方がいいかも。&lt;/div&gt;&lt;div&gt;他の値もあるみたいですが、管理人はよく分かっていません。（ARX のときに使う値かも？？？）&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R18.1\ACAD-9001:411\Applications\AVDO_Point\Commands] の下にコマンド名を書いています。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R18.1\ACAD-9001:411\Applications\AVDO_Point\Groups] の下に、コマンド グループ名を書いています。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-4850026997870693170?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/4850026997870693170/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/10/net-dll-autocad-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/4850026997870693170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/4850026997870693170'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/10/net-dll-autocad-2011.html' title='.NET - DLL ファイルを自動的にロードする（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-3307308397095028961</id><published>2010-10-21T19:35:00.000+09:00</published><updated>2011-01-05T20:13:09.098+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET - ダイナミック ブロックをコピーする（AutoCAD 2011）</title><content type='html'>先日アンケートをいただいて、その中にダイナミック ブロックのコピーがうまくいかないという質問をいただきました。&lt;br /&gt;&lt;br /&gt;ということで、&lt;a href="http://goo.gl/FlRi"&gt;dblk.dwg&lt;/a&gt; という図面を作って試してみました。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://goo.gl/FlRi"&gt;dblk.dwg&lt;/a&gt; には、上から&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;test という名前のダイナミック ブロック&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;test2&amp;nbsp;という名前のダイナミック ブロック&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;円&lt;br /&gt;がありますが、clone メソッドでコピーしてみると、下の2つは問題ないのですが、test に関しては、ブロック名が test ではなくて *U4 になってしまいました。&lt;br /&gt;&lt;br /&gt;きっとダイナミック ブロックはコピーしなきゃいけない情報が他のオブジェクトよりもあるのでしょう。&lt;br /&gt;&lt;br /&gt;そこで、いろいろググッてみました。&lt;br /&gt;なかなかそれらしいのが見つからなかったのですが DeepCloneObjects っていうのでできそうってことをやっと見つけました。&lt;br /&gt;&lt;br /&gt;何度か諦めようかと思ったのですが、やっぱりあると信じて辛抱強く探すことが大事だなと再認識です。&lt;br /&gt;&lt;br /&gt;ということで、以下のような感じでやってみたら test という名前のダイナミック ブロックもブロック名が変わることなくコピーできました。&lt;br /&gt;&lt;br /&gt;'---------------------------------------------------------&lt;br /&gt;Dim doc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;Dim db As Database = doc.Database&lt;br /&gt;Dim ed As Editor = doc.Editor&lt;br /&gt;&lt;br /&gt;Using trans As Transaction = db.TransactionManager.StartTransaction&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim selEntID As ObjectId = Application.DocumentManager.MdiActiveDocument.Editor.GetEntity("オブジェクトを選択").ObjectId&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim objIds As ObjectIdCollection = New ObjectIdCollection()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;objIds.Add(selEntID)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim idMap As IdMapping = New IdMapping&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;db.DeepCloneObjects(objIds, db.CurrentSpaceId, idMap, False)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For Each idP As IdPair In idMap&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim cpObj As DBObject = trans.GetObject(idP.Value, OpenMode.ForWrite)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If TypeOf cpObj Is Entity Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim cpEnt As Entity = cpObj&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cpEnt.ColorIndex = 1&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim pt1 As Point3d = New Point3d(0, 0, 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim vec1 As Vector3d = pt1.GetVectorTo(New Point3d(110, 0, 0))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cpEnt.TransformBy(Matrix3d.Displacement(vec1))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Next&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;trans.Commit()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Catch ex As Autodesk.AutoCAD.Runtime.Exception&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Application.ShowAlertDialog(ex.Message)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;End Try&lt;br /&gt;End Using&lt;br /&gt;'---------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;それと、全然別件なのですが、このときたまたま&amp;nbsp;CurrentSpaceId っていうのがあることに気が付きました。&lt;br /&gt;今まで管理人は、現在モデル空間にるかペーパー空間にいるかの判断を以下のように CVPORT を見てやっていました。&lt;br /&gt;&lt;br /&gt;'---------------------------------------------------------&lt;br /&gt;&lt;br /&gt;If Application.GetSystemVariable("CVPORT") = 1 Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;btRec = trans.GetObject(bt(BlockTableRecord.PaperSpace), OpenMode.ForWrite)&lt;br /&gt;Else&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;btRec = trans.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite)&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;'---------------------------------------------------------&lt;br /&gt;&lt;br /&gt;でも、以下のように&amp;nbsp;CurrentSpaceId を使った方が良さそうですね。&lt;br /&gt;&lt;br /&gt;'---------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Dim cSpace As BlockTableRecord = trans.GetObject(db.CurrentSpaceId, OpenMode.ForRead)&lt;br /&gt;If cSpace.Name = "*Model_Space" Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;btRec = trans.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite)&lt;br /&gt;Else&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;btRec = trans.GetObject(bt(BlockTableRecord.PaperSpace), OpenMode.ForWrite)&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;'---------------------------------------------------------&lt;br /&gt;&lt;br /&gt;ということで、これからは&amp;nbsp;CurrentSpaceId を使おうかと思います。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-3307308397095028961?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/3307308397095028961/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/10/net-autocad-2011_21.html#comment-form' title='4 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3307308397095028961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3307308397095028961'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/10/net-autocad-2011_21.html' title='.NET - ダイナミック ブロックをコピーする（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-5884744889694080196</id><published>2010-09-02T19:54:00.000+09:00</published><updated>2011-01-05T20:13:09.102+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET - ブロックに含まれる属性の値と位置を取得するサンプル コード（AutoCAD 2011）</title><content type='html'>.NET でブロックに含まれる属性の値と位置を所得できるか試してみました。&lt;br /&gt;&lt;br /&gt;属性値は AttributeReference.TextString Propertyで、位置は&amp;nbsp;AttributeReference.Position Property で取得できました。&lt;br /&gt;&lt;br /&gt;位置に関しては、ブロックが入れ子になっているときは、TransformBy Method で Matrix3d を使用してあげるとちゃんとした位置を取得できるようです。&lt;br /&gt;&lt;br /&gt;サンプル コードでは、入れ子は 1 階層まで見るようになってます。また、ブロックに尺度が付いている場合は、X と Y が同じ尺度になっている場合にうまく行くようになっています。X と Y の尺度が違う時は、正しい場所を取得してくれないと思います。もし、X と Y の尺度が違う時も対応したいときは、別のマトリックスの指定をする必要があると思います。&lt;br /&gt;&lt;br /&gt;サンプル コードは &lt;a href="https://docs.google.com/leaf?id=0BxoWXW6gryMDNTc2NDE5YzgtMjA0Mi00NjBlLWJmNzktYzVjYzAwMWIyYTY2&amp;amp;sort=name&amp;amp;layout=list&amp;amp;num=50" targer="_blank"&gt;こちら&lt;/a&gt;&amp;nbsp;です。&lt;br /&gt;DLL は &lt;a href="https://docs.google.com/leaf?id=0BxoWXW6gryMDODY2NjU4MjMtYjJkMy00MmY2LWI5Y2QtNTA2ZTAyNWI3NDE5&amp;amp;sort=name&amp;amp;layout=list&amp;amp;num=50" targer="_blank"&gt;こちら&lt;/a&gt;&amp;nbsp;です。&lt;br /&gt;試してみた図面は &lt;a href="https://docs.google.com/leaf?id=0BxoWXW6gryMDZDQ3M2YwNTEtYWU0ZS00ZGQ2LWE4ZmEtNjc2NTEzNGM3NGUz&amp;amp;sort=name&amp;amp;layout=list&amp;amp;num=50" targer="_blank"&gt;こちら&lt;/a&gt; です。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-5884744889694080196?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/5884744889694080196/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/09/net-autocad-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/5884744889694080196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/5884744889694080196'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/09/net-autocad-2011.html' title='.NET - ブロックに含まれる属性の値と位置を取得するサンプル コード（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-4082992586368571417</id><published>2010-09-01T20:13:00.000+09:00</published><updated>2011-01-05T20:13:09.104+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET（サンプル プログラム） - 「実行中のコマンドのエイリアスを設定」（AutoCAD 2011）</title><content type='html'>例えば、LINE[線分] コマンドを実行するときに、コマンド ラインに 「L」 と入力してコマンドを実行することができますよね。&lt;br /&gt;慣れていると、リボンのタブを選んでボタンを選んでってするより早いと思います。&lt;br /&gt;&lt;br /&gt;この設定は、acad.pgp ってファイルにされているんですが、それを変更する方法としては ［管理］ タブの ［エイリアスを編集］ を選択して、手動で acad.pgp を修正したり、Express Tools の ALIASEDIT［Command Alias］ コマンドで変更することができます。&lt;br /&gt;&lt;br /&gt;でも、ちょっと面倒くさくてなかなかやらないかなっと思ったので、今回は、もっと簡単に設定することができないかと思って、.NET でカスタマイズしてみました。&lt;br /&gt;&lt;br /&gt;使い方はこんな感じです。&lt;br /&gt;&lt;ol&gt;&lt;li&gt;NETLOAD コマンドで AVDO_SetAlias.dll をロードする。&lt;br /&gt;※ acad.lsp で自動的にロードするよう設定しておけば、AutoCAD を起動するたびにロードする必要がないので楽ちんです。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;エイリアスを設定したいコマンドを実行。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;割り込みコマンドで&amp;nbsp;AVDO_SetAlias コマンドを実行。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;「コマンドに対するエイリアスを入力:」 に対して設定したいエイリアスを入力。&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;※&amp;nbsp;AVDO_SetAlias コマンド自体にエイリアスを設定しておけば、もっと簡単になると思います。&lt;br /&gt;※ 実行中のコマンドに対して設定するので、ダイアログが表示されるコマンドや、REGEN コマンドのようにコマンドを実行するとすぐに終わっちゃって、コマンド実行中にコマンドラインに入力できないコマンドに対して設定することはできません。&lt;br /&gt;&lt;br /&gt;その他細々としたことに関しても動画を作りましたので見てみてください。&lt;br /&gt;&lt;br /&gt;&lt;object height="340" width="560"&gt;&lt;param name="movie" value="http://www.youtube.com/v/m9qZFr98-ls?fs=1&amp;amp;hl=ja_JP&amp;amp;rel=0&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/m9qZFr98-ls?fs=1&amp;amp;hl=ja_JP&amp;amp;rel=0&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;DLL は &lt;a href="https://docs.google.com/leaf?id=0BxoWXW6gryMDOTgxM2U4NTgtOTEwMS00NmUyLWE2ZGMtZDUzOTI1NzA2Nzhl&amp;amp;hl=ja" target="_blank"&gt;こちら&lt;/a&gt;、ソースは &lt;a href="https://docs.google.com/leaf?id=0BxoWXW6gryMDMmZiZDcxZTQtM2U1MS00ZjAxLWJkZWItYTFmYjVmMWQxYTE4&amp;amp;hl=ja" target="_blank"&gt;こちら&lt;/a&gt;です。&lt;br /&gt;&lt;br /&gt;※ 今回から、Google ドキュメントにファイルおいて、上の 「こちら」 にリンクしてます。んー、Google ドキュメントって便利だねー。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-4082992586368571417?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/4082992586368571417/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/09/net-autocad-2011_01.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/4082992586368571417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/4082992586368571417'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/09/net-autocad-2011_01.html' title='.NET（サンプル プログラム） - 「実行中のコマンドのエイリアスを設定」（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-2155012243884820107</id><published>2010-08-20T22:33:00.000+09:00</published><updated>2011-01-05T20:13:09.108+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET - ブロックに含まれる属性の値を変更するサンプル コード（AutoCAD 2011）</title><content type='html'>.NET でブロックに含まれる属性の値を変更できるか試してみました。&lt;br /&gt;&lt;br /&gt;試してみたところ、手順としては以下のような感じでできました。&lt;br /&gt;&lt;ol&gt;&lt;li&gt;図面中のブロック参照を抽出&lt;/li&gt;&lt;li&gt;該当する名前のブロック参照に対して&amp;nbsp;AttributeCollection を称して属性を抽出&lt;/li&gt;&lt;li&gt;属性の値（TextString）を変更&lt;/li&gt;&lt;/ol&gt;AVDO_UpdateAttribute.dll は &lt;a href="http://files.acadvideo.com/2010/08/20100820/AVDO_UpdateAttribute.dll"&gt;こちら&lt;/a&gt;、ソースは &lt;a href="http://files.acadvideo.com/2010/08/20100820/AVDO_UpdateAttribute.zip"&gt;こちら&lt;/a&gt;、試しに使用する test.dwg は &lt;a href="http://files.acadvideo.com/2010/08/20100820/TEST.dwg"&gt;こちら&lt;/a&gt; にあります。&lt;br /&gt;&lt;br /&gt;試し方は以下のとおりです。&lt;br /&gt;&lt;ol&gt;&lt;li&gt;NETLOAD コマンドで&amp;nbsp;AVDO_UpdateAttribute.dll&amp;nbsp;をロードします。&lt;/li&gt;&lt;li&gt;test.dwg&amp;nbsp;を開きます。（属性付きのブロック参照 『表題欄』 が表示されます。）&lt;/li&gt;&lt;li&gt;AVDO_UpdateAttribute コマンドを実行します。&lt;/li&gt;&lt;li&gt;表示された ［属性編集］ ダイアログで、新しい値を入力して ［OK］ ボタンをクリックします。&lt;/li&gt;&lt;/ol&gt;これで、ブロック参照 『表題欄』 に含まれる属性の値が変更されます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-2155012243884820107?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/2155012243884820107/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/08/net-autocad-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/2155012243884820107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/2155012243884820107'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/08/net-autocad-2011.html' title='.NET - ブロックに含まれる属性の値を変更するサンプル コード（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-5254198628513830083</id><published>2010-08-19T09:00:00.000+09:00</published><updated>2011-01-05T20:13:09.112+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET（サンプル プログラム） - 「AutoCAD LT の グループ ツールバーと同様の動作にする」（AutoCAD 2011）</title><content type='html'>AutoCAD LT のグループ コマンドは AutoCAD のとは違うということはなんとなく知ってはいたんですが、今回いろいろ触ってみました。確かに AutoCAD LT の方が簡単にグループを作ったり分解したりできるんですね。&lt;br /&gt;&lt;br /&gt;AutoCAD LT には、PKFSTGROUP や&amp;nbsp;PKUNGROUP っていう AutoCAD には無いコマンドがあります。&lt;br /&gt;これらのコマンドは、PICKFIRST に対応してるので、簡単にグループを作ったり分解できます。（AutoCAD の GROUP コマンドは&amp;nbsp;PICKFIRST に対応してないようです。）&lt;br /&gt;&lt;br /&gt;また、ツイッターで 『AutoCAD LTの「グループ」ツールバーをAutoCADでも使えるようにしたい』 っていうリクエストもいただいたので、PKFSTGROUP や&amp;nbsp;PKUNGROUP のようなコマンドを AutoCAD でも使えるように .NET で作ってみました。&lt;br /&gt;（他にも何かリクエストがあれば、&lt;a href="https://spreadsheets0.google.com/viewform?formkey=dHduT2hXSm1RTnJZYUZHbTc4UVdJMVE6MQ" target="_blank"&gt;アンケート&lt;/a&gt; などからお知らせいただければ、できる限りブログに情報をアップしたいと思ってます。）&lt;br /&gt;&lt;br /&gt;AVDO_PKFSTGROUP.dll が &lt;a href="http://files.acadvideo.com/2010/08/20100818/AVDO_PKFSTGROUP.dll"&gt;こちら&lt;/a&gt; で、ソースが &lt;a href="http://files.acadvideo.com/2010/08/20100818/AVDO_PKFSTGROUP.txt" target="_blank"&gt;こちら&lt;/a&gt; です。&lt;br /&gt;&lt;br /&gt;AutoCAD LT の PKFSTGROUP コマンドに対応するのが&amp;nbsp;AVDO_PKFSTGROUP コマンドです。&lt;br /&gt;AutoCAD LT の&amp;nbsp;PKUNGROUP&amp;nbsp;コマンドに対応するのが&amp;nbsp;AVDO_PKUNGROUP コマンドです。&lt;br /&gt;&lt;br /&gt;また、ツールバーの作成例も含んだ動画を作りましたので、見てみてください。&lt;br /&gt;&lt;br /&gt;&lt;object height="340" width="560"&gt;&lt;param name="movie" value="http://www.youtube.com/v/shoFGPqcTtc?fs=1&amp;amp;hl=ja_JP&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/shoFGPqcTtc?fs=1&amp;amp;hl=ja_JP&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;ツールバーのマクロは以下のとおりです。&lt;br /&gt;&lt;blockquote&gt;【グループ】&lt;br /&gt;^C^C_AVDO_PKFSTGROUP&lt;br /&gt;&lt;br /&gt;【グループを解除】&lt;br /&gt;^C^C_AVDO_PKUNGROUP&lt;br /&gt;&lt;br /&gt;【グループ管理...】&lt;br /&gt;^C^C_GROUP&lt;br /&gt;&lt;br /&gt;【グループ選択オン/オフ】&lt;br /&gt;'_setvar;pickstyle;$M=$(if,$(eq,$(getvar,pickstyle),0),1,$(if,$(eq,$(getvar,pickstyle),1),0,$(if,$(eq,$(getvar,pickstyle),2),3,2)))&amp;nbsp;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-5254198628513830083?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/5254198628513830083/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/08/net-autocad-lt-autocad-2011.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/5254198628513830083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/5254198628513830083'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/08/net-autocad-lt-autocad-2011.html' title='.NET（サンプル プログラム） - 「AutoCAD LT の グループ ツールバーと同様の動作にする」（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-2078040812824717226</id><published>2010-08-13T11:35:00.000+09:00</published><updated>2011-01-05T20:13:09.115+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET（サンプル プログラム） - 「点オブジェクトと似た動作をするブロックの作成」（AutoCAD 2011）</title><content type='html'>久しぶりに .NET の勉強のため、サンプル プログラムを作ってみました。&lt;br /&gt;&lt;br /&gt;しばらくやらないと、せっかく勉強したこともなかなか思い出せなくてダメですね。&lt;br /&gt;&lt;br /&gt;DDPTYPE[点スタイル管理 D] コマンドで点オブジェクトの表示スタイルを変更できますが、表示スタイルは AutoCAD が用意したものしか使えないので、ブロックを点オブジェクトと似た動作をするようにしてみました。&lt;br /&gt;&lt;br /&gt;ただし、ブロックなので、レイアウトで複数のビューポートがあるときは、点オブジェクトと違った動きになります。&lt;br /&gt;&lt;br /&gt;プログラムの内容としては、今まで勉強してきた以下の機能を使ってみました。&lt;br /&gt;&lt;blockquote&gt;ディクショナリの登録&lt;br /&gt;ブロックに Xrecord を追加&lt;br /&gt;イベント&lt;br /&gt;などなど&lt;/blockquote&gt;作ったコマンドはこんな感じです。&lt;br /&gt;&lt;blockquote&gt;AVDO_DDPTYPE（または AVD）コマンド　：　［点スタイル管理（AVDO_Point）] ダイアログを表示するコマンド&lt;br /&gt;AVDO_POINT（または AVP）コマンド　：　ブロックを点として挿入するコマンド&lt;br /&gt;AVDO_POINT_EVENT（または AVPE）コマンド　：　イベントを登録するコマンド&lt;br /&gt;AVDO_POINT_EVENT_REMOVE（または AVPER）コマンド　：　イベントの登録を解除するコマンド&lt;/blockquote&gt;&lt;br /&gt;動作の詳細は、動画を見てみてください。&lt;br /&gt;&lt;br /&gt;&lt;object height="340" width="560"&gt;&lt;param name="movie" value="http://www.youtube.com/v/H5cugllSaqs?fs=1&amp;amp;hl=ja_JP&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/H5cugllSaqs?fs=1&amp;amp;hl=ja_JP&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;DLL は &lt;a href="http://files.acadvideo.com/2010/08/20100813/AVDO_Point.dll"&gt;こちら&lt;/a&gt;、ソースは &lt;a href="http://files.acadvideo.com/2010/08/20100813/AVDO_Point.zip"&gt;こちら&lt;/a&gt; にあります。&lt;br /&gt;&lt;br /&gt;※ レイアウトでモデル空間をアクティブにしても、ペーパー空間にブロックが作成されてしまう間違いを修正してファイルを置き換えました。（2010/08/14）&lt;br /&gt;※ ロックされた画層に点ブロックがあって再作図すると大きさが変わらない現象も見つけたので修正してファイルを置き換えました。（2010/08/14）&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-2078040812824717226?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/2078040812824717226/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/08/net-autocad-2011_13.html#comment-form' title='6 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/2078040812824717226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/2078040812824717226'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/08/net-autocad-2011_13.html' title='.NET（サンプル プログラム） - 「点オブジェクトと似た動作をするブロックの作成」（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-8236749550339268111</id><published>2010-07-11T20:10:00.000+09:00</published><updated>2011-01-05T20:13:09.119+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET - 「他の図面にバックグラウンドでアクセス」（AutoCAD 2011）</title><content type='html'>今開いている図面以外の図面に対してバックグラウンドでアクセスできるか試してみました。&lt;br /&gt;&lt;br /&gt;ReadDwgFile メソッドで今開いていない図面を読み込むことができるようです。&lt;br /&gt;&lt;br /&gt;試しに作成したコードは &lt;a href="http://files.acadvideo.com/2010/07/20100711/OpenDwgTest.txt"&gt;こちら&lt;/a&gt; で、ビルドした DLL は &lt;a href="http://files.acadvideo.com/2010/07/20100711/OpenDwgTest.dll"&gt;こちら&lt;/a&gt; です。&lt;br /&gt;&lt;br /&gt;AVDO_CheckLayer コマンドを実行して、図面ファイルを選択すると、選択した図面にあって今開いている図面にない画層があれば、それが表示されます。&lt;br /&gt;&lt;br /&gt;動画も作ってみましたので、見てみてください。&lt;br /&gt;&lt;object height="340" width="560"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Tw_3tcAktBM&amp;amp;hl=ja_JP&amp;amp;fs=1?rel=0&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Tw_3tcAktBM&amp;amp;hl=ja_JP&amp;amp;fs=1?rel=0&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;これと同じ方法で、２つの図面のシステム変数の比較ができるかもしれません。&lt;br /&gt;そうすれば、特定の図面でのみ発生する現象がシステム変数の影響かどうかを確認しやすくなりそうなので、後日チャレンジしてみたいと思います。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-8236749550339268111?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/8236749550339268111/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/07/net-autocad-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/8236749550339268111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/8236749550339268111'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/07/net-autocad-2011.html' title='.NET - 「他の図面にバックグラウンドでアクセス」（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-3998783719648768026</id><published>2010-07-06T22:12:00.000+09:00</published><updated>2011-01-05T20:13:09.127+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET - 「AutoCAD をバックグラウンドで実行する方法見つからず」（AutoCAD 2011）</title><content type='html'>Twitter でもつぶやいていたんですが、Windows アプリから AutoCAD をバックグラウンドで起動して何か実行することをやろうと思ったのですが、残念ながら方法を見つけることができませんでした。&lt;br /&gt;&lt;br /&gt;今回はギブアップだったのですが、一応履歴としてどんなことしたか書いとこうかと思います。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;「AutoCAD .NET デベロッパガイド」を参考に、CreateObjec を使ってこんな感じで AutoCAD を起動することができました。&lt;br /&gt;&lt;blockquote&gt;Dim acAppComObj As AcadApplication&lt;br /&gt;acAppComObj = CreateObject("AutoCAD.Application.18.1")&lt;/blockquote&gt;&lt;br /&gt;で、起動したあとにこんな感じで NETLOAD コマンドを実行してロードしたあとコマンドを実行します。&lt;br /&gt;&lt;blockquote&gt;acDocComObj.SendCommand("(command " &amp;amp; Chr(34) &amp;amp; "NETLOAD" &amp;amp; Chr(34) &amp;amp; " " &amp;amp; _&lt;br /&gt;Chr(34) &amp;amp; "c:/myapps/mycommands.dll" &amp;amp; Chr(34) &amp;amp; ") ")&lt;br /&gt;&lt;br /&gt;acDocComObj.SendCommand("MyCommand ")&lt;/blockquote&gt;&lt;br /&gt;実行するコマンドで、最後に図面を保存して AutoCAD を終了するようにしておけば、勝手に作業を初めて勝手に終了するという動作になります。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;【できなかったこと】&lt;/b&gt;&lt;br /&gt;CreateObject で AutoCAD を起動できたんですが、AutoCAD のウインドウを表示することなくバックグラウンドで動かすことができませんでした。&lt;br /&gt;&lt;br /&gt;acAppComObj.Visible = False とすれば非表示になるんですが、一旦 AutoCAD が起動してくるのが見えて、その後非表示という動きになりました。また、その後 SendCommand を実行すると、また AutoCAD のウインドウが表示されてしまいました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ということで、AutoCAD を起動する方法として探してみたら、こんな方法がありました。&lt;br /&gt;&lt;blockquote&gt;Dim regKey As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Autodesk\AutoCAD\R18.1\ACAD-9001:411")&lt;br /&gt;Dim acadLoc As String = DirectCast(regKey.GetValue("Location"), String)&lt;br /&gt;&lt;br /&gt;Dim acad As ProcessStartInfo = New ProcessStartInfo(acadLoc &amp;amp; "\acad.exe")&lt;br /&gt;acad.Arguments = "/nologo"&lt;br /&gt;'acad.WindowStyle = ProcessWindowStyle.Hidden&lt;br /&gt;&lt;br /&gt;Dim pro As Process&lt;br /&gt;pro = Process.Start(acad)&lt;/blockquote&gt;&lt;br /&gt;この後、こんな感じで AutoCAD　のインスタンスを取得することができます。&lt;br /&gt;&lt;blockquote&gt;Dim acAppComObj() As AcadApplication&lt;br /&gt;acAppComObj = GetObject(, "AutoCAD.Application.18.1")&lt;/blockquote&gt;&lt;br /&gt;でも、これだとプログラムが AutoCAD が起動してくるまで待ってくれないで先に進んでしまうので、ちゃんと動きません。&lt;br /&gt;&lt;br /&gt;WaitForInputIdle っていうので待ってくれるかなと思ったんですが、待ってくれませんでした。&lt;br /&gt;&lt;br /&gt;そこで、WaitForExit(20000) で 20 秒間待つようにしてみたところ、ちゃんと動くようになりました。&lt;br /&gt;でも、もし AutoCAD が起動するまで 20 秒以上たったらちゃんと動かないし、安全のためもっと長くしても時間がかかってもったいないですよね。&lt;br /&gt;&lt;br /&gt;また、もっと大きな問題で、AutoCAD が他に起動されていると、そっちに&amp;nbsp;SendCommand で指定したコマンドが送られてしまうのでおかしなことになってしまいます。&lt;br /&gt;&lt;br /&gt;複数 AutoCAD が起動しているときに識別する方法がないかググッてみたのですが、残念ながらその方法を見つけることができませんでした。（VB.NET では無理なのかも？？？）&lt;br /&gt;&lt;br /&gt;ということで、今回はギブアップしてしまいました…残念。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-3998783719648768026?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/3998783719648768026/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/07/net-autocad-autocad-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3998783719648768026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3998783719648768026'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/07/net-autocad-autocad-2011.html' title='.NET - 「AutoCAD をバックグラウンドで実行する方法見つからず」（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-1921338123103824883</id><published>2010-07-02T09:00:00.000+09:00</published><updated>2011-01-05T20:13:09.131+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET（サンプル プログラム） - 「図面で実行されたコマンドを集計」（AutoCAD 2011）</title><content type='html'>ディクショナリの使い方を勉強してみました。&lt;br /&gt;&lt;br /&gt;ディクショナリを作って、情報を保存して、その情報を取得してといった一通りを試してみました。&lt;br /&gt;&lt;br /&gt;どんな動作にしようかと思ったのですが、とりあえず作ってみたコマンドと関数はこんな感じです。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;AVDO_StartCountCommands　：　コマンドが開始されたときのイベントを登録し、ディクショナリを追加するコマンド&lt;/li&gt;&lt;li&gt;CommandStarted　：　コマンドが開始されたときに実行する関数&lt;/li&gt;&lt;li&gt;AVDO_EndCountCommands　：　コマンドが開始されたときのイベントの登録を解除するコマンド&lt;/li&gt;&lt;li&gt;AVDO_RemoveCountCommandsDictionary　：　追加したディクショナリを削除するコマンド&lt;/li&gt;&lt;li&gt;AVDO_ShowCommandsCount　：　各コマンドの実行回数を表示するコマンド&lt;/li&gt;&lt;/ul&gt;コードは &lt;a href="http://files.acadvideo.com/2010/07/20100702/CountCommands.txt"&gt;こちら&lt;/a&gt; で、ビルドした DLL は &lt;a href="http://files.acadvideo.com/2010/07/20100702/CountCommands.dll"&gt;こちら&lt;/a&gt;です。&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;【使い方の例】&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;NETLOAD コマンドで CountCommands.dll をロード&lt;/li&gt;&lt;li&gt;AVDO_StartCountCommands コマンドを実行&lt;/li&gt;&lt;li&gt;いくつかコマンドを実行した後、AVDO_ShowCommandsCount コマンドを実行すると、どのコマンドを何回実行したか表示されます。&lt;/li&gt;&lt;/ol&gt;※ AutoCAD が自動的に実行しているコマンドも表示されます。&lt;br /&gt;※ REDRAW、REDRAWALL、QVDRAWING、QVLAYOUT コマンドに対してはうまく動かなかったので、除外しました。&lt;br /&gt;&lt;br /&gt;使ってみた動画も作ってみました。&lt;br /&gt;&lt;br /&gt;&lt;object height="340" width="560"&gt;&lt;param name="movie" value="http://www.youtube.com/v/svVLm37mCDw&amp;amp;hl=ja_JP&amp;amp;fs=1?rel=0&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/svVLm37mCDw&amp;amp;hl=ja_JP&amp;amp;fs=1?rel=0&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-1921338123103824883?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/1921338123103824883/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/07/net-autocad-2011_02.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/1921338123103824883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/1921338123103824883'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/07/net-autocad-2011_02.html' title='.NET（サンプル プログラム） - 「図面で実行されたコマンドを集計」（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-7089496466926721775</id><published>2010-06-25T09:00:00.000+09:00</published><updated>2011-01-05T20:13:09.140+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET - 「画層の追加と削除」（AutoCAD 2011）</title><content type='html'>以前、画層の追加を試してみましたが、今回は画層の削除も試してみました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Erase メソッドで画層は削除できるのですが、削除していい画層かどうかを確認しておかないと大変な事になってしまうので、注意が必要です。&lt;br /&gt;&lt;br /&gt;例えば、「テスト」画層があって、その画層に線分などがあるのに、「テスト」画層を消しちゃったら図面がおかしくなっちゃいますよね。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;削除していいかどうかは、Purge メソッドで確認することになります。（Purge メソッドを実行すると、削除できないオブジェクトはオブジェクトIDコレクションからなくなるので、それをもとに判断）&lt;br /&gt;&lt;br /&gt;試しに作ってみたコードは &lt;a href="http://files.acadvideo.com/2010/06/20100625/AVDO_EraseLayer.txt"&gt;こちら&lt;/a&gt; です。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-7089496466926721775?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/7089496466926721775/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/06/net-autocad-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/7089496466926721775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/7089496466926721775'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/06/net-autocad-2011.html' title='.NET - 「画層の追加と削除」（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-5348638412586255307</id><published>2010-06-18T09:00:00.000+09:00</published><updated>2011-01-05T20:13:09.144+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET で気を付けること 「ドキュメントのロックと解除」</title><content type='html'>今日は、先週の .NET のトレーニングで教えてもらった、ドキュメントのロックと解除について書こうと思います。&lt;br /&gt;&lt;br /&gt;モーダル ダイアログのときはいいのですが、モードレス ダイアログを使うときは、ドキュメントをロックしてから作業を行い、最後にロックを解除する必要があるそうです。&lt;br /&gt;&lt;br /&gt;モードレス ダイアログがアクティブになると、元のドキュメントが非アクティブになり、そういうときはドキュメントをロックする必要があるそうです。&lt;br /&gt;&lt;br /&gt;なので、コンテキスト メニューに自分のメニューを追加して実行する時もドキュメントをロックする必要があります。&lt;br /&gt;&lt;br /&gt;それをしないと、複数の図面を操作している時とかにエラーになることがあるようです。（異常終了することも？？？）&lt;br /&gt;&lt;br /&gt;以前、試しにダイアログを作ってみましたが、ロックのことは知りませんでした。&lt;br /&gt;そのときは、コマンドを実行するたびモードレス ダイアログが表示されてしまって、モードレス ダイアログが表示されているかどうか確認する方法を知らなかったので、モーダル ダイアログにしていたので気がつきませんでした。&lt;br /&gt;&lt;br /&gt;ということで、モードレス ダイアログやコンテキスト メニューなどを使ってプログラムを作成するときは気を付けましょう。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;こんな感じでロックして&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim docLock As DocumentLock = Application.DocumentManager.MdiActiveDocument.LockDocument()&lt;br /&gt;&lt;br /&gt;作業終了後にこんな感じで解除します。&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;docLoc.Dispose()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;「.NET デベロッパ ガイド」にもこんな記述がありました。&lt;br /&gt;&lt;br /&gt;------------------------------------------------------&lt;br /&gt;ドキュメントのロックとロック解除&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;オブジェクトの変更要求や AutoCAD へのアクセスは、さまざまな状況で、いくつものアプリケーションから発生します。他の要求との競合を防ぐため、変更を加える前にドキュメントをロックする必要があります。特定の状況でドキュメントをロックできなかった場合、データベースの変更時にロック違反が発生します。次の場合に、ドキュメントのロックが必要になります。&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;アプリケーションでモードレス ダイアログ ボックスから AutoCAD とやり取りする&lt;/li&gt;&lt;li&gt;アプリケーションでカレント ドキュメント以外のロード済みドキュメントにアクセスする&lt;/li&gt;&lt;li&gt;アプリケーションが COM サーバとして使用されている&lt;/li&gt;&lt;li&gt;アプリケーションでコマンドを Session コマンド フラグに登録する&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;たとえば、現在のドキュメント以外のドキュメントにあるモデル空間またはペーパー空間に図形を追加する場合、ドキュメントをロックする必要があります。ロックするには、ロックする Database オブジェクトの LockDocument メソッドを使用します。LockDocument メソッドが呼び出されると、DocumentLock オブジェクトが返されます。&lt;br /&gt;&lt;br /&gt;ロックしたデータベースの変更を終えたら、データベースをロック解除する必要があります。データベースをロック解除するには、DocumentLock オブジェクトの Dispose メソッドを呼び出します。DocumentLock オブジェクトで Using 文を使用することもできます。Using 文が終了するとデータベースがロック解除されます。&lt;br /&gt;&lt;br /&gt;注: Session コマンド フラグを使用しないコマンドで作業する場合、変更前に現在のドキュメントのデータベースをロックする必要はありません。&lt;br /&gt;------------------------------------------------------&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-5348638412586255307?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/5348638412586255307/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/06/net.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/5348638412586255307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/5348638412586255307'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/06/net.html' title='.NET で気を付けること 「ドキュメントのロックと解除」'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-8152205644200338056</id><published>2010-06-11T09:00:00.000+09:00</published><updated>2011-01-05T20:13:09.147+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET（サンプル プログラム） - 「寸法を特定の画層に作成する」（AutoCAD 2011）</title><content type='html'>イベントっていうので、コマンド実行時やコマンド終了時などなどにある処理を実行するっていうことができるみたいです。&lt;br /&gt;なので、早速試してみました。&lt;br /&gt;&lt;br /&gt;試しに作ってみたプログラムの動作はこんな感じです。&lt;br /&gt;&lt;br /&gt;-------------------------------------------------------------&lt;br /&gt;・ コマンド名は、ACVD_DrawDimOnDimLayer です。&lt;br /&gt;&amp;nbsp;&amp;nbsp;このコマンドを、図面ごとに一回だけ実行すると、以下のコマンドが実行されたときに自動的に動作します。&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DIMLINEAR&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DIMALIGNED&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DIMANGULAR&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DIMARC&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DIMRADIUS&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DIMDIAMETER&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DIMORDINATE&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DIMJOGGED&lt;br /&gt;&lt;br /&gt;・ 「寸法」画層が存在しない場合は、「寸法」画層を作成する。&lt;br /&gt;&lt;br /&gt;・ コマンド終了後、現在層が元に戻る。&lt;br /&gt;&lt;br /&gt;・&amp;nbsp;ACVD_DrawDimOnDimLayer_Remove コマンドを実行すると、その図面ではこの動作は行わなくなります。&lt;br /&gt;-------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;コードは &lt;a href="http://files.acadvideo.com/2010/06/20100611/ACVD_DrawDimOnDimLayer.txt"&gt;こちら&lt;/a&gt;です。&lt;br /&gt;dll ファイルは &lt;a href="http://files.acadvideo.com/2010/06/20100611/ACAD%20Video%20Blog.dll"&gt;こちら&lt;/a&gt; です。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-8152205644200338056?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/8152205644200338056/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/06/net-autocad-2011_11.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/8152205644200338056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/8152205644200338056'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/06/net-autocad-2011_11.html' title='.NET（サンプル プログラム） - 「寸法を特定の画層に作成する」（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-8642862314200849622</id><published>2010-06-04T09:00:00.000+09:00</published><updated>2011-01-05T20:13:09.149+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET の勉強 「表示、フリーズ、ロック の設定を反転する」（AutoCAD 2011）</title><content type='html'>以前、&lt;a href="http://blog.acadvideo.com/search/label/%E6%82%A9%E3%81%BF%E4%BA%8B" target="_Blank"&gt;悩み事 ： 画層のフリーズ状態を反転する簡単な方法は？（AutoCAD LT 2011）&lt;/a&gt;&amp;nbsp;で画層のフリーズ状態を反転する簡単な方法はないかなぁ ということを書きました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;折角 .NET の勉強を始めたので、そのコマンドを作ってみました。（.NET なので、LT では使えませんが…）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;書いたコードはこんな感じです。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' 画層の フリーズ や ON/OFF の設定を逆にするコマンド&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;CommandMethod("ACVD_Blog", "_ACVD_ToggleLayer", "ACVD_ToggleLayer", CommandFlags.Modal)&amp;gt; _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Public Sub ACVD_ToggleLayer()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim doc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim db As Database = doc.Database&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ed As Editor = doc.Editor&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim trans As Transaction = db.TransactionManager.StartTransaction&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim laTbl As LayerTable = trans.GetObject(db.LayerTableId, OpenMode.ForRead)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim prRes As PromptResult&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim pko As PromptKeywordOptions = New PromptKeywordOptions("")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pko.Message = vbLf &amp;amp; "どの設定を反転しますか？"&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pko.Keywords.Add("On", "On", "表示(O)")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pko.Keywords.Add("Freeze", "Freeze", "フリーズ(F)")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pko.Keywords.Add("Lock", "Lock", "ロック(L)")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pko.AllowNone = False&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;prRes = ed.GetKeywords(pko)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If prRes.Status &amp;lt;&amp;gt; PromptStatus.OK Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For Each objId As ObjectId In laTbl&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim laTblRec As LayerTableRecord = trans.GetObject(objId, OpenMode.ForWrite)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' オプションとして「表示(O)」が選択されたとき&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If prRes.StringResult.ToString = "On" Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If laTblRec.IsOff = True Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'MsgBox(laTblRec.Name &amp;amp; "画層はオフです")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;laTblRec.IsOff = False&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Else&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'MsgBox(laTblRec.Name &amp;amp; "画層はオンです")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;laTblRec.IsOff = True&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' オプションとして「フリーズ(F)」が選択されたとき&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If prRes.StringResult.ToString = "Freeze" Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If laTblRec.IsFrozen = True Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;laTblRec.IsFrozen = False&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' 現在層はフリーズできないので、現在層の場合は処理を行わないように設定&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ElseIf laTblRec.ObjectId &amp;lt;&amp;gt; db.Clayer Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;laTblRec.IsFrozen = True&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' オプションとして「ロック(L)」が選択されたとき&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If prRes.StringResult.ToString = "Lock" Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If laTblRec.IsLocked = True Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;laTblRec.IsLocked = False&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Else&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;laTblRec.IsLocked = True&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Next&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;trans.Commit()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Catch ex As Autodesk.AutoCAD.Runtime.Exception&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Application.ShowAlertDialog(ex.ToString)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Finally&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;trans.Dispose()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Try&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Sub&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ビルドした ACAD Video Blog.dll は &lt;a href="http://files.acadvideo.com/dotNET/ACAD%20Video%20Blog.dll/ACAD%20Video%20Blog.dll"&gt;ここ&lt;/a&gt; からダウンロードできます。&lt;br /&gt;これを NETLOAD コマンドでロードして、ACVD_ToggleLayer コマンドを実行すると、「どの設定を反転しますか？ [表示(O)/フリーズ(F)/ロック(L)]:」 というオプションが表示されるので、オプションを入力すると、その設定が反転されます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-8642862314200849622?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/8642862314200849622/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/06/net-autocad-2011_04.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/8642862314200849622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/8642862314200849622'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/06/net-autocad-2011_04.html' title='.NET の勉強 「表示、フリーズ、ロック の設定を反転する」（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-7577108866814459222</id><published>2010-06-03T09:00:00.000+09:00</published><updated>2011-01-05T20:13:09.153+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET の勉強 「ユーザ入力のプロンプト - GetString と GetPoint」（AutoCAD 2011）</title><content type='html'>前回は GetKeywords メソッドを使ってみましたが、ユーザ入力のプロンプトとして GetString メソッド や GetPoint メソッド というのもあるようなので、それらも試してみたいと思います。&lt;br /&gt;&lt;br /&gt;で、GetString メソッドですが、オンライン ヘルプにあったサンプルはこんな感じです。&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;blockquote&gt;&amp;lt; CommandMethod("GetStringFromUser") &amp;gt; _&lt;br /&gt;Public Sub GetStringFromUser()&lt;br /&gt;&amp;nbsp;&amp;nbsp;Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Dim pStrOpts As PromptStringOptions = New PromptStringOptions(vbLf &amp;amp; _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "Enter your name: ")&lt;br /&gt;&amp;nbsp;&amp;nbsp;pStrOpts.AllowSpaces = True&lt;br /&gt;&amp;nbsp;&amp;nbsp;Dim pStrRes As PromptResult = acDoc.Editor.GetString(pStrOpts)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Application.ShowAlertDialog("The name entered was: " &amp;amp; _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pStrRes.StringResult)&lt;br /&gt;End Sub&lt;/blockquote&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;これを実行すると、入力した文字がダイアログに表示されるのですが、それだけじゃおもしろくないので、入力した内容の MTEXT を作成するようにしてみました。&lt;br /&gt;また、MTEXT の基点を GetPoint で取得するようにもしてみました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;CommandMethod("ACVD_Blog", "_ACVD_CreateMtext", "ACVD_CreateMtext", CommandFlags.Modal)&amp;gt; _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Public Sub ACVD_CreateMtext()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim db As Database = acDoc.Database&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ed As Editor = acDoc.Editor&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim trans As Transaction = db.TransactionManager.StartTransaction&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim pStrOpts As PromptStringOptions = New PromptStringOptions(vbLf &amp;amp; "文字を入力: ")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pStrOpts.AllowSpaces = True&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim pStrRes As PromptResult = ed.GetString(pStrOpts)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If pStrRes.Status &amp;lt;&amp;gt; PromptStatus.OK Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ppo As PromptPointOptions = New PromptPointOptions(vbLf &amp;amp; "基点を指定: ")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ppo.AllowNone = False&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim pr As PromptPointResult = ed.GetPoint(ppo)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If pr.Status &amp;lt;&amp;gt; PromptStatus.OK Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim blkTbl As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForRead)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim br As BlockTableRecord = trans.GetObject(blkTbl(BlockTableRecord.ModelSpace), OpenMode.ForWrite)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim mt As MText = New MText()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mt.Location = pr.Value&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mt.TextHeight = 5.0&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mt.ColorIndex = 1&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mt.Contents = pStrRes.StringResult&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;br.AppendEntity(mt)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;trans.AddNewlyCreatedDBObject(mt, True)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;trans.Commit()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Catch ex As Autodesk.AutoCAD.Runtime.Exception&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Application.ShowAlertDialog(ex.ToString)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Finally&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;trans.Dispose()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; End Sub&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-7577108866814459222?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/7577108866814459222/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/06/net-getstring-getpointautocad-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/7577108866814459222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/7577108866814459222'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/06/net-getstring-getpointautocad-2011.html' title='.NET の勉強 「ユーザ入力のプロンプト - GetString と GetPoint」（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-3117192030707577682</id><published>2010-05-28T09:00:00.000+09:00</published><updated>2011-01-05T20:13:22.376+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET の勉強 「画層状態を復元するサンプル」（AutoCAD 2011）</title><content type='html'>なんか最近 .NET が続いてますが、覚え始めでおもしろくて、ちょっとはまってきたかも。&lt;br /&gt;ということで、今日も .NET です。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;acad_mdg.chm「AutoCAD .NET デベロッパ ガイド」のサンプルに画層状態を復元するものがあったので試してみました。&lt;br /&gt;&lt;br /&gt;サンプルにあったコードはこんな内容です。&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;&amp;lt;CommandMethod("RestoreLayerState")&amp;gt; _&lt;br /&gt;Public Sub RestoreLayerState()&lt;br /&gt;&amp;nbsp;&amp;nbsp;'' Get the current document&lt;br /&gt;&amp;nbsp;&amp;nbsp;Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Dim acLyrStMan As LayerStateManager&lt;br /&gt;&amp;nbsp;&amp;nbsp;acLyrStMan = acDoc.Database.LayerStateManager&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Dim sLyrStName As String = "ColorLinetype"&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;If acLyrStMan.HasLayerState(sLyrStName) = True Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;acLyrStMan.RestoreLayerState(sLyrStName, _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ObjectId.Null, _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1, _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LayerStateMasks.Color + _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LayerStateMasks.LineType)&lt;br /&gt;&amp;nbsp;&amp;nbsp;End If&lt;br /&gt;End Sub&lt;/b&gt;&lt;/blockquote&gt;&lt;br /&gt;で、昨日つくったやつでは、ACVD_LayerState っていう画層状態に保存するようにしたので、ACVD_LayerState があれば、その状態を復元するように変更してみました。&lt;br /&gt;&lt;br /&gt;変更後のコードはこんな感じです。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' ACVD_LayerState という画層状態が存在すれば、それを復元するサンプル（acad_mdg.chm「AutoCAD .NET デベロッパ ガイド」のサンプルを元に作成）&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;CommandMethod("ACVD_Blog", "_ACVD_RestoreLayerState", "ACVD_RestoreLayerState", CommandFlags.Modal)&amp;gt; _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Public Sub ACVD_RestoreLayerState()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Get the current document&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ed As Editor = acDoc.Editor&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acLyrStMan As LayerStateManager&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acLyrStMan = acDoc.Database.LayerStateManager&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim sLyrStName As String = "ACVD_LayerState"&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If acLyrStMan.HasLayerState(sLyrStName) = True Then&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' 本当に画層状態を復元するかどうかの確認を求める&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim pr As PromptResult&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim pko As PromptKeywordOptions = New PromptKeywordOptions("")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pko.Message = vbLf &amp;amp; "画層状態を復元しますか？"&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pko.Keywords.Add("Yes", "Yes", "はい(Y)")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pko.Keywords.Add("No", "No", "いいえ(N)")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pko.AllowNone = False&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pr = ed.GetKeywords(pko)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If pr.Status &amp;lt;&amp;gt; PromptStatus.OK Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' 画層状態の復元&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If pr.StringResult.ToString = "Yes" Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acLyrStMan.RestoreLayerState(sLyrStName, _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ObjectId.Null, _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1, _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LayerStateMasks.On + _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LayerStateMasks.Frozen + _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LayerStateMasks.Locked + _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LayerStateMasks.Plot + _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LayerStateMasks.Color + _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LayerStateMasks.LineType + _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LayerStateMasks.LineWeight + _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LayerStateMasks.Transparency + _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LayerStateMasks.PlotStyle + _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LayerStateMasks.NewViewport)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Else&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Else&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Application.ShowAlertDialog("ACVD_LayerState という画層状態が存在しないため、画層状態を復元できません。")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Catch ex As Autodesk.AutoCAD.Runtime.Exception&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MsgBox(ex.ToString)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Sub&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;間違えてコマンドを実行してしまうとまずいので、「画層状態を復元しますか？」と表示して はい(Y) か いいえ(N) を選ぶように追加してみました。&lt;br /&gt;GetKeywords っていうのをこんな感じかなと思って入れてみたのですが、とりあえずこれで試してみたら、一応ちゃんと動きました。&lt;br /&gt;ビルドした DLL ファイルは &lt;a href="http://files.acadvideo.com/dotNET/ACAD%20Video%20Blog.dll/ACAD%20Video%20Blog.dll"&gt;こちら&lt;/a&gt; です。&lt;br /&gt;&lt;br /&gt;NETLOAD コマンドで ACAD Video Blog.dll をロードして、ACVD_RestoreLayerState コマンドを実行すると、ACVD_LayerState という画層状態が存在すれば、それが復元されます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-3117192030707577682?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/3117192030707577682/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/05/net-autocad-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3117192030707577682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3117192030707577682'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/05/net-autocad-2011.html' title='.NET の勉強 「画層状態を復元するサンプル」（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-8632102331806175109</id><published>2010-05-27T09:00:00.000+09:00</published><updated>2011-01-05T20:13:22.380+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET の勉強 「画層状態を保存するサンプル」（AutoCAD 2011）</title><content type='html'>acad_mdg.chm「AutoCAD .NET デベロッパ ガイド」のサンプルに画層状態を保存するものがあったので試してみました。&lt;br /&gt;&lt;br /&gt;サンプルにあったコードはこんな内容です。&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;&amp;lt;CommandMethod("RestoreLayerState")&amp;gt; _&lt;br /&gt;Public Sub RestoreLayerState()&lt;br /&gt;'' Get the current document&lt;br /&gt;Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;&lt;br /&gt;Dim acLyrStMan As LayerStateManager&lt;br /&gt;acLyrStMan = acDoc.Database.LayerStateManager&lt;br /&gt;&lt;br /&gt;Dim sLyrStName As String = "ColorLinetype"&lt;br /&gt;&lt;br /&gt;If acLyrStMan.HasLayerState(sLyrStName) = True Then&lt;br /&gt;acLyrStMan.RestoreLayerState(sLyrStName, _&lt;br /&gt;ObjectId.Null, _&lt;br /&gt;1, _&lt;br /&gt;LayerStateMasks.Color + _&lt;br /&gt;LayerStateMasks.LineType)&lt;br /&gt;End If&lt;br /&gt;End Sub&lt;/b&gt;&lt;/blockquote&gt;&lt;br /&gt;保存するのは、色と線種だけみたいなので、その他の設定も保存するように変更してみました。&lt;br /&gt;&lt;br /&gt;また、既に同じ名前の画層状態があったら、何もしてくれないので、既に同じ名前の画層状態があったら、削除して作りなおすようにしてみました。&lt;br /&gt;&lt;br /&gt;それと、Try～Catch も入れてみました。こんな使い方でいいのかなぁ…&lt;br /&gt;&lt;br /&gt;変更後のコードはこんな感じです。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' 画層状態の保存のサンプル（acad_mdg.chm「AutoCAD .NET デベロッパ ガイド」のサンプルを元に作成）&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;CommandMethod("ACVD_Blog", "_ACVD_CreateLayerState", "ACVD_CreateLayerState", CommandFlags.Modal)&amp;gt; _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Public Sub ACVD_CreateLayerState()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Get the current document&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acLyrStMan As LayerStateManager&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acLyrStMan = acDoc.Database.LayerStateManager&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim sLyrStName As String = "ACVD_LayerState"&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' もし、既に同じ名前の画層状態があったら削除する&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If acLyrStMan.HasLayerState(sLyrStName) = True Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acLyrStMan.DeleteLayerState(sLyrStName)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;' 画層状態を保存する&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acLyrStMan.SaveLayerState(sLyrStName, _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LayerStateMasks.On + _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LayerStateMasks.Frozen + _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LayerStateMasks.Locked + _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LayerStateMasks.Plot + _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LayerStateMasks.Color + _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LayerStateMasks.LineType + _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LayerStateMasks.LineWeight + _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LayerStateMasks.Transparency + _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LayerStateMasks.PlotStyle + _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LayerStateMasks.NewViewport, _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ObjectId.Null)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Catch ex As Autodesk.AutoCAD.Runtime.Exception&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MsgBox(ex.ToString)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Try&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Sub&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;これで試してみたら、一応ちゃんと動きました。&lt;br /&gt;ビルドした DLL ファイルは &lt;a href="http://files.acadvideo.com/dotNET/ACAD%20Video%20Blog.dll/ACAD%20Video%20Blog.dll"&gt;こちら&lt;/a&gt; です。&lt;br /&gt;&lt;br /&gt;NETLOAD コマンドで&amp;nbsp;ACAD Video Blog.dll をロードして、ACVD_CreateLayerState コマンドを実行すると、現在の画層状態が&amp;nbsp;ACVD_LayerState という名前で保存されます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-8632102331806175109?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/8632102331806175109/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/05/net-autocad-2011_27.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/8632102331806175109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/8632102331806175109'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/05/net-autocad-2011_27.html' title='.NET の勉強 「画層状態を保存するサンプル」（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-3772772187021787848</id><published>2010-05-26T09:00:00.000+09:00</published><updated>2011-01-05T20:13:22.388+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET の勉強 「役立つ動画がオートデスクの Web サイトに…」（AutoCAD 2011）</title><content type='html'>今まで、オンライン ヘルプのサンプルとかを見ながら .NET の勉強をしていましたが、なんと オートデスクの Web サイトに動画で説明している資料がありました。知らなかった…&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.autodesk.co.jp/adsk/servlet/item?siteID=1169823&amp;amp;id=8084566" target="_blank"&gt;ここ&lt;/a&gt; にある &lt;s&gt;AutoCAD 2010 .NET Wizard&lt;/s&gt;（誤） DevTV (DeveloperTV)（正） がそれです。（間違えてたので修正しました。2010/05/27 管理人）&lt;br /&gt;&lt;br /&gt;ここでは、以下の内容が、実際にコードを書きながら説明されています。&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;簡単なアプリケーションの作成&lt;/li&gt;&lt;li&gt;図形を図面に追加&lt;/li&gt;&lt;li&gt;図形の編集&lt;/li&gt;&lt;li&gt;アプリケーションのデータ保存&lt;/li&gt;&lt;li&gt;イベント監視&lt;/li&gt;&lt;/ul&gt;動画を見ながら自分でもコードを書いて試せるので、とても便利です。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;オンライン ヘルプのサンプルでは、Using ～ という記述になってるところがここでは、Try ～Catch という記述になってますね。&lt;br /&gt;&lt;br /&gt;エラーの処理ができるので、きっとこっちの方がいいのでしょう。&lt;br /&gt;ということで、今後はこっちで行こうかと思います。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-3772772187021787848?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/3772772187021787848/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/05/net-web-autocad-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3772772187021787848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3772772187021787848'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/05/net-web-autocad-2011.html' title='.NET の勉強 「役立つ動画がオートデスクの Web サイトに…」（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-2317731140839561838</id><published>2010-05-21T09:00:00.000+09:00</published><updated>2011-01-05T20:13:22.392+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>AutoCAD 2011 .Net Wizards を使用して .NET プロジェクトを作成（AutoCAD 2011）</title><content type='html'>今日は、AutoCAD Managed VB Application Wizard っていうのを使用して .NET プロジェクトを作成できるようなので、それを試してみた結果を書こうかと思います。&lt;br /&gt;&lt;br /&gt;まずは、&lt;a href="http://usa.autodesk.com/adsk/servlet/index?siteID=123112&amp;amp;id=1911627" target="_blank"&gt;Developer Center&lt;/a&gt; にある 「AutoCAD 2011 .Net Wizards.zip」 をダウンロードして、それに含まれる AutoCAD 2011 dotNET Wizards.msi を実行してインストールです。&lt;br /&gt;&lt;br /&gt;すると、こんなメッセージがでて、ちゃんとインストールできませんでした。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_-VEZIC7K5VU/S_OwmzIxJOI/AAAAAAAAARA/YrPvwzeees0/s1600/error01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="160" src="http://2.bp.blogspot.com/_-VEZIC7K5VU/S_OwmzIxJOI/AAAAAAAAARA/YrPvwzeees0/s400/error01.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;管理者権限で、Windows 7 にログインしてるんですけど。。。&lt;br /&gt;&lt;br /&gt;ぶつぶつ言ってもしょうがないので、コマンド プロンプトを 「管理者として実行」 で起動して、そこから&amp;nbsp;AutoCAD 2011 dotNET Wizards.msi を実行してみました。&lt;br /&gt;&lt;br /&gt;すると、今度は問題なくインストールが完了しました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ということで、早速 Visual Studio 2008 を起動です。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[ファイル] - [新しいプロジェクト] で [新しいプロジェクト] ダイアログを表示して、[Vusual Basic] を選択すると、[AutoCAD 2011 plug-in] というテンプレートがでてきたので、これを選んで OK です。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_-VEZIC7K5VU/S_O559Ej78I/AAAAAAAAARI/Lk5640dFyv8/s1600/NewProject.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/_-VEZIC7K5VU/S_O559Ej78I/AAAAAAAAARI/Lk5640dFyv8/s400/NewProject.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;そうすると、[AutoCAD .NET Wizard Configurator] ダイアログが表示されるので、[Spacify the location of the ...] のことろに ObjectARX 2011 の inc フォルダを指定して Ok です。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_-VEZIC7K5VU/TNyh9eXnBCI/AAAAAAAAAS0/3dRCUjmkbWY/s1600/dotNetWizard.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="236" src="http://4.bp.blogspot.com/_-VEZIC7K5VU/TNyh9eXnBCI/AAAAAAAAAS0/3dRCUjmkbWY/s400/dotNetWizard.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;これで、プロジェクトが開かれるのですが、ここでは既に参照設定に AcDbMgd と AcMgd　が追加されているので、参照設定は何もする必要がないみたいです。&lt;br /&gt;&lt;br /&gt;で、MyCommands.vb っていうのがあったので、これを見てみると、こんな記述がありました。&lt;br /&gt;&lt;blockquote&gt;&amp;lt;CommandMethod("MyGroup", "MyCommand", "MyCommandLocal", CommandFlags.Modal)&amp;gt; _&lt;br /&gt;Public Sub MyCommand() ' This method can have any name&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: red;"&gt;' Put your command code here&lt;/span&gt;&lt;br /&gt;End Sub&lt;/blockquote&gt;ここに、自分で作ったコマンドを入れるってことですね。&lt;br /&gt;&lt;br /&gt;ということで、まずはコマンドの定義のところを以下のように変更しました。&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;&amp;lt;CommandMethod("acadvideo", "test0521", "MyCommandLocal", CommandFlags.Modal)&amp;gt; _&lt;br /&gt;Public Sub test0521() ' This method can have any name&lt;/b&gt;&lt;/blockquote&gt;&lt;br /&gt;また、ソリューション エクスプローラにある myCommands.res をダブルクリックして&amp;nbsp;myCommands.res を表示して、MyCommand を test0521 に変更しました。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_-VEZIC7K5VU/S_Uav6s_mhI/AAAAAAAAARY/WaiH8tdjqkY/s1600/myCommands.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="162" src="http://2.bp.blogspot.com/_-VEZIC7K5VU/S_Uav6s_mhI/AAAAAAAAARY/WaiH8tdjqkY/s400/myCommands.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;そして、「' Put your command code here」の下に以下を記述してみました。&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;'' Get the current document and database&lt;br /&gt;Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;Dim acCurDb As Database = acDoc.Database&lt;br /&gt;&lt;br /&gt;'' Start a transaction&lt;br /&gt;Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;'' Open the Block table for read&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/b&gt;&lt;/span&gt;Dim acBlkTbl As BlockTable&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/b&gt;&lt;/span&gt;acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/b&gt;&lt;/span&gt;'' Open the Block table record Model space for write&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/b&gt;&lt;/span&gt;Dim acBlkTblRec As BlockTableRecord&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/b&gt;&lt;/span&gt;acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace),&amp;nbsp;OpenMode.ForWrite)&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;'' Create a line that starts at 5,5 and ends at 12,3&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Dim acLine As Line = New Line(New Point3d(5, 5, 0),&amp;nbsp;New Point3d(12, 3, 0))&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;acLine.SetDatabaseDefaults()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/b&gt;&lt;/span&gt;'' Add the new object to the block table record and the transaction&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/b&gt;&lt;/span&gt;acBlkTblRec.AppendEntity(acLine)&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/b&gt;&lt;/span&gt;acTrans.AddNewlyCreatedDBObject(acLine, True)&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/b&gt;&lt;/span&gt;'' Save the new object to the database&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/b&gt;&lt;/span&gt;acTrans.Commit()&lt;br /&gt;End Using&lt;/b&gt;&lt;/blockquote&gt;&lt;br /&gt;AutoCAD にロードして test0521 コマンドを実行してみたところ、問題なく線分が作成されました。&lt;br /&gt;&lt;br /&gt;このテンプレートを使えば、簡単に作れますよってことですね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-2317731140839561838?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/2317731140839561838/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/05/autocad-2011-net-wizards-net-autocad.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/2317731140839561838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/2317731140839561838'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/05/autocad-2011-net-wizards-net-autocad.html' title='AutoCAD 2011 .Net Wizards を使用して .NET プロジェクトを作成（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_-VEZIC7K5VU/S_OwmzIxJOI/AAAAAAAAARA/YrPvwzeees0/s72-c/error01.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-6555133465207420908</id><published>2010-05-14T09:00:00.000+09:00</published><updated>2011-01-05T20:13:22.406+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET の勉強 「画層の作成」（AutoCAD 2011）</title><content type='html'>金曜日恒例の .NET の勉強です。&lt;br /&gt;今日は、画層を作成してみました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ヘルプでサンプルを探して、サンプルの余分なところを削除して、こんなコードを書きました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Imports Autodesk.AutoCAD.ApplicationServices&lt;br /&gt;Imports Autodesk.AutoCAD.EditorInput&lt;br /&gt;Imports Autodesk.AutoCAD.Runtime&lt;br /&gt;Imports Autodesk.AutoCAD.DatabaseServices&lt;br /&gt;&lt;br /&gt;Public Class Class1&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;CommandMethod("CreateLayer")&amp;gt; _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Public Sub CreateLayer()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim acCurDb As Database = acDoc.Database&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim acLyrTbl As LayerTable&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;acLyrTbl = acTrans.GetObject(acCurDb.LayerTableId, OpenMode.ForRead)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim sLayerName As String = "テスト"&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;If acLyrTbl.Has(sLayerName) = False Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim acLyrTblRec As LayerTableRecord = New LayerTableRecord()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;acLyrTblRec.Name = sLayerName&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;acLyrTbl.UpgradeOpen()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;acLyrTbl.Add(acLyrTblRec)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;acTrans.AddNewlyCreatedDBObject(acLyrTblRec, True)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;acTrans.Commit()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;End Using&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;End Sub&lt;br /&gt;End Class&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;で、実際に実行してみると、めでたく 「テスト」 という名前の画層が作成されました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;また、ついでに色と線種の設定も試してみました。&lt;br /&gt;以下の内容を&amp;nbsp;acLyrTblRec.Name = sLayerName の後に書いたら、うまく色と線種の設定もできました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;acLyrTblRec.Color = Color.FromColorIndex(ColorMethod.ByAci, 1)&lt;br /&gt;acLyrTblRec.LineWeight = LineWeight.LineWeight020&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;(Imports Autodesk.AutoCAD.Colors も追加しました。)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-6555133465207420908?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/6555133465207420908/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/05/net-autocad-2011_14.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/6555133465207420908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/6555133465207420908'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/05/net-autocad-2011_14.html' title='.NET の勉強 「画層の作成」（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-599719060880201808</id><published>2010-05-07T09:00:00.000+09:00</published><updated>2011-01-05T20:13:22.410+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET の勉強 「ダイアログを表示してコマンド実行」（AutoCAD 2011）</title><content type='html'>金曜日恒例の .NET の勉強をしました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;今までいくつかサンプルを見ながら試してきましたが、そろそろダイアログを出してみたくなってきたので、試してみました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;arxmgd.chm の [Autodesk.AutoCAD.ApplicationServices Namespace] - [Application Class] に ShowModalDialog Method と ShowModelessDialog というのがあるので、きっとこれですね。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;まずは、フォームの作成&lt;/b&gt;&lt;br /&gt;まずは、Form1.vb&amp;nbsp;（Windows フォーム）を作成して、ボタンをひとつ追加しました。&lt;br /&gt;で、そのボタンをクリックすると、前回の試してみた円を作成して ZOOM を行う、以下の内容が実行されるように記述しました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Imports Autodesk.AutoCAD.ApplicationServices&lt;br /&gt;Imports Autodesk.AutoCAD.EditorInput&lt;br /&gt;Imports Autodesk.AutoCAD.Runtime&lt;br /&gt;&lt;br /&gt;Public Class Form1&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acDoc.SendStringToExecute("._circle 2,2,0 4 ", True, False, False)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acDoc.SendStringToExecute("._zoom _extents ", True, False, False)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;End Sub&lt;br /&gt;End Class&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ダイアログの表示&lt;/b&gt;&lt;br /&gt;あとは、Form1 を表示するように&amp;nbsp;ShowModalDialog Method または ShowModelessDialog を使えばいいみたいです。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Imports Autodesk.AutoCAD.ApplicationServices&lt;br /&gt;Imports Autodesk.AutoCAD.EditorInput&lt;br /&gt;Imports Autodesk.AutoCAD.Runtime&lt;br /&gt;&lt;br /&gt;Public Class Class1&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;CommandMethod("test")&amp;gt; _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Public Sub test()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim f As New Form1()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Application.ShowModelessDialog(f)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;End Sub&lt;br /&gt;End Class&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;これで test コマンド実行してみると、ちゃんとダイアログが表示され、ボタンをクリックすると円が作成されて ZOOM が実行されました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ただし、もう一回 test コマンドを実行すると、またダイアログが表示されました。&lt;br /&gt;コマンドを実行するたびにダイアログが表示されてしまいます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;そこで、ダイアログを表示するところを以下のようにしてみたのですが、ダメでした。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;If f.Visible = False Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Application.ShowModelessDialog(f)&lt;br /&gt;End If&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;残念ながら現時点では、どうすればダイアログが既に表示されているかどうかを判断できるかは不明です？？？&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;モーダル ダイアログにすれば、ダイアログを閉じないと AutoCAD に戻れないので複数ダイアログが表示されることはないので、とりあえず今回は以下のようにモーダル ダイアログにしてみます。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Application.ShowModalDialog(f)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ただしこのとき、モーダル ダイアログにしたのでダイアログを閉じるコードを Form1.vb の最後に記述しておかないと、ダイアログが自動的に閉じてくれません。&lt;br /&gt;そのため、Form1.vb に以下を追加しました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;Me.Close()&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-599719060880201808?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/599719060880201808/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/05/net-autocad-2011_07.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/599719060880201808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/599719060880201808'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/05/net-autocad-2011_07.html' title='.NET の勉強 「ダイアログを表示してコマンド実行」（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-1676018468115306520</id><published>2010-04-30T09:00:00.000+09:00</published><updated>2011-01-05T20:13:22.448+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET の勉強 「AutoCAD コマンド ラインへのアクセス」（AutoCAD 2011）</title><content type='html'>金曜日なので、.NET の勉強をしました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;AutoLISP では、(command "._LINE" "0,0" "100,100" "") みたいに、COMMAND 関数を使って、コマンド ラインに入力するのと同じ手順を書くことによってコマンドを実行することができますが、同じようなことを .NET でできないか調べてみました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;すると、サンプルにこんなのがありました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Imports Autodesk.AutoCAD.ApplicationServices&lt;br /&gt;Imports Autodesk.AutoCAD.Runtime&lt;br /&gt;&lt;br /&gt;&amp;lt;CommandMethod("SendACommandToAutoCAD")&amp;gt; _&lt;br /&gt;&lt;commandmethod&gt;&lt;/commandmethod&gt;&lt;br /&gt;Public Sub SendACommandToAutoCAD()&lt;br /&gt;&amp;nbsp;&amp;nbsp;Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;&amp;nbsp;&amp;nbsp;'' Draws a circle and zooms to the extents or&lt;br /&gt;&amp;nbsp;&amp;nbsp;'' limits of the drawing&lt;br /&gt;&amp;nbsp;&amp;nbsp;acDoc.SendStringToExecute("._circle 2,2,0 4 ", True, False, False)&lt;br /&gt;&amp;nbsp;&amp;nbsp;acDoc.SendStringToExecute("._zoom _all ", True, False, False)&lt;br /&gt;End Sub&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;さっそくこれをカット＆ペーストして確認してみたところ、CRCLE コマンドと ZOOM コマンドが無事実行されました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SendStringToExecute ってやつで実行するんですね。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;試しに、&lt;br /&gt;&lt;br /&gt;&lt;b&gt;acDoc.SendStringToExecute("._line 0,0 100,100 &amp;nbsp;", True, False, False)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;を追記してみたら、問題なく線分を作成することができました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-1676018468115306520?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/1676018468115306520/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/04/net-autocad-autocad-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/1676018468115306520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/1676018468115306520'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/04/net-autocad-autocad-2011.html' title='.NET の勉強 「AutoCAD コマンド ラインへのアクセス」（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-1424641891956683035</id><published>2010-04-23T09:00:00.000+09:00</published><updated>2011-01-05T20:13:22.455+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET の勉強 「arxmgd.chm を見ながらオブジェクトの作成」（AutoCAD 2011）</title><content type='html'>金曜日なので、.NET の勉強です。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;先週は、「今後も、どんどん進んでいこうと思います。」 と言っていましたが、ちょっとヘルプの見方とか少しですが分かってきたような気がするので、もう一度復習でオブジェクトの作図についてやってみようと思います。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C:\ObjectARX 2011\docs フォルダにある&amp;nbsp;arxmgd.chm&amp;nbsp;を見ながら、オブジェクトを描くプログラムを作成したいと思います。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;まず最初に、こんなコードを書いてみます。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Imports Autodesk.AutoCAD.ApplicationServices&lt;br /&gt;Imports Autodesk.AutoCAD.EditorInput&lt;br /&gt;Imports Autodesk.AutoCAD.Runtime&lt;br /&gt;Imports Autodesk.AutoCAD.DatabaseServices&lt;br /&gt;&lt;br /&gt;Public Class Class1&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;commandmethod("drawobjects")&gt;&amp;lt;CommandMethod("DrawObjects")&amp;gt;&amp;nbsp;_&lt;/commandmethod("drawobjects")&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Public Sub DrawObjects()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Get the current document and database&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acCurDb As Database = acDoc.Database&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Start a transaction&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Open the Block table for read&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acBlkTbl As BlockTable&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Open the Block table record Model space for write&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acBlkTblRec As BlockTableRecord&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;OpenMode.ForWrite)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: red;"&gt;''線分を作成&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acLine As New Line()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acBlkTblRec.AppendEntity(acLine)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acTrans.AddNewlyCreatedDBObject(acLine, True)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Save the new object to the database&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acTrans.Commit()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Using&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;End Sub&lt;br /&gt;End Class&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ここで、線分を作成しているのは、Dim acLine As New Line() になります。&lt;br /&gt;arxmgd.chm の&lt;br /&gt;&lt;blockquote&gt;Autodesk.AutoCAD.DatabaseServices Namespace &amp;gt; Line Class &amp;gt; Line Constructor&lt;/blockquote&gt;にある Line.Line() について以下の記述があります。&lt;br /&gt;&lt;blockquote&gt;Default constructor. Initializes the normal vector to (0,0,1), the start and end points to (0,0,0), and the thickness to 0.0. All coordinates are WCS.&lt;/blockquote&gt;ということで、これを実行すると、始点も終点も 0,0 の線分が作成されます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;また、arxmgd.chm の&lt;br /&gt;&lt;blockquote&gt;Autodesk.AutoCAD.DatabaseServices Namespace &amp;gt; Line Class &amp;gt; Line Properties&lt;/blockquote&gt;を見ると、以下のプロパティがあります。&lt;br /&gt;&lt;blockquote&gt;Angle、Delta、EndPoint、Length、Normal、StartPoint、Thickness&lt;/blockquote&gt;でも、Angle、Delta、Length の Conditions は Read-only と書かれているので、線分を作成するときに&amp;nbsp;EndPoint、Normal、StartPoint、Thickness のプロパティを使えるんだと思います。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;そこで、以下のように 4 つのプロパティを指定するよう追記してみました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Dim acLine As Line = NEW Line()&lt;br /&gt;acLine.StartPoint = New Point3d(50, 50, 0)&lt;br /&gt;acLine.EndPoint = New Point3d(100, 100, 0)&lt;br /&gt;acLine.Normal = New Vector3d(1, 0, 0)&lt;br /&gt;acLine.Thickness = 2&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;すると、始点が 50,50、終点が 100,100、UCS に依存する押し出し方向が 1,0,0、厚さが 2 の線分が作成されました。&lt;br /&gt;&lt;br /&gt;※ Point3d や Vector3d は、Autodesk.AutoCAD.Geometry 名前空間になるので、「Imports Autodesk.AutoCAD.Geometry」 という記述も追加しました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;プロパティには、線分以外のオブジェクトに共通のものがありますよね。例えば、色とか線種とか。&lt;br /&gt;それは、きっと&lt;br /&gt;&lt;blockquote&gt;Autodesk.AutoCAD.DatabaseServices Namespace &amp;gt; Entity Class &amp;gt; Entity Properties&lt;/blockquote&gt;にある内容になるんだと思います。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;そこで、以下も追加してみました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;acLine.ColorIndex = 1&lt;br /&gt;acLine.Linetype = "continuous"&lt;br /&gt;acLine.LineWeight = &amp;amp;HD3&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;すると、赤色で、線種が continuous で、線の太さが 2.11 mm になりました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;では、今度は楕円にチャレンジです。&lt;br /&gt;（Autodesk.AutoCAD.DatabaseServices Namespace &amp;gt; Ellipse Class を見ながらやりました。）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;線分と同じような感じで、以下のようにやってみましたが、エラーとなって描けませんでした。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Dim acEllipse As Ellipse = New Ellipse()&lt;br /&gt;acEllipse.StartParam = 0&lt;br /&gt;acEllipse.EndParam = 1&lt;br /&gt;acEllipse.Center = New Point3d(10, 10, 0)&lt;br /&gt;acEllipse.RadiusRatio = 0.5&lt;br /&gt;acEllipse.StartAngle = 0&lt;br /&gt;acEllipse.EndAngle = PI&lt;br /&gt;&lt;br /&gt;acBlkTblRec.AppendEntity(acEllipse)&lt;br /&gt;acTrans.AddNewlyCreatedDBObject(acEllipse, True)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;何ででしょうね？いろいろ試してみましたが、管理人には何故かわかりませんでした。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;そこで、以下のように記述を変えて実行したところ、楕円も作成できました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Dim acEllipse As Ellipse = New Ellipse(New Point3d(10, 10, 0), Vector3d.ZAxis, New Vector3d(1, 0, 0), 0.5, 0, PI)&lt;br /&gt;acEllipse.StartParam = 0&lt;br /&gt;acEllipse.EndParam = 1&lt;br /&gt;acEllipse.Center = New Point3d(10, 10, 0)&lt;br /&gt;acEllipse.RadiusRatio = 0.5&lt;br /&gt;acEllipse.StartAngle = 0&lt;br /&gt;acEllipse.EndAngle = PI&lt;br /&gt;&lt;br /&gt;acBlkTblRec.AppendEntity(acEllipse)&lt;br /&gt;acTrans.AddNewlyCreatedDBObject(acEllipse, True)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;※ PI を認識するために、「Imports System.Math」 も追記しました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;以前よりも理解しながらオブジェクトを作れたような気がします。&lt;br /&gt;次回は、今度こそ、先に進んで新しいことにチャレンジしたいと思います。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-1424641891956683035?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/1424641891956683035/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/04/net-arxmgdchm-autocad-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/1424641891956683035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/1424641891956683035'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/04/net-arxmgdchm-autocad-2011.html' title='.NET の勉強 「arxmgd.chm を見ながらオブジェクトの作成」（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-7397678519609313261</id><published>2010-04-16T09:00:00.000+09:00</published><updated>2011-01-05T20:13:22.461+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET の勉強 「オブジェクトの削除、コピー、移動」（AutoCAD 2011）</title><content type='html'>先週から、金曜日は .NET の勉強をしようかということにしたので、今日はその続きです。&lt;br /&gt;&lt;br /&gt;前回は、オブジェクトを作成するプログラムの勉強をしたので、今回は、オブジェクトの削除やコピーや移動などを行うサンプルを探してみました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;そこで、こんなサンプルを見つけて、とりあえず実行してみました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Imports Autodesk.AutoCAD.Runtime&lt;br /&gt;Imports Autodesk.AutoCAD.ApplicationServices&lt;br /&gt;Imports Autodesk.AutoCAD.DatabaseServices&lt;br /&gt;Imports Autodesk.AutoCAD.Geometry&lt;br /&gt;&lt;br /&gt;&amp;lt;CommandMethod("EraseObject")&amp;gt;&amp;nbsp;_&lt;br /&gt;Public Sub EraseObject()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;'' Get the current document and database&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim acCurDb As Database = acDoc.Database&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;'' Start a transaction&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Open the Block table for read&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acBlkTbl As BlockTable&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Open the Block table record Model space for write&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acBlkTblRec As BlockTableRecord&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;OpenMode.ForWrite)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Create a lightweight polyline&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acPoly As Polyline = New Polyline()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acPoly.SetDatabaseDefaults()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acPoly.AddVertexAt(0, New Point2d(2, 4), 0, 0, 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acPoly.AddVertexAt(1, New Point2d(4, 2), 0, 0, 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acPoly.AddVertexAt(2, New Point2d(6, 4), 0, 0, 0)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Add the new object to the block table record and the transaction&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acBlkTblRec.AppendEntity(acPoly)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acTrans.AddNewlyCreatedDBObject(acPoly, True)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Update the display and display an alert message&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acDoc.Editor.Regen(）&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Application.ShowAlertDialog("Erase the newly added polyline.")&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Erase the polyline from the drawing&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acPoly.Erase(True)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Save the new object to the database&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acTrans.Commit()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;End Using&lt;br /&gt;End Sub&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;このプログラムは、ポリラインをひとつ作成して、それを削除するようです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ポリラインの作成に関しては、前回の線分、円、MTEXT の作成と同じように、オブジェクトを宣言したあと、それぞれのプロパティを指定しているようです。（「'' Create a lightweight polyline」 以下の 5 行 および 「'' Add the new object to the block table record and the transaction」 以下の 2 行。）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;で、削除しているのは、acPoly.Erase(True) ですね。&lt;br /&gt;意外と簡単ですね。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;他のコピーを行うサンプルを見てみたところ、Clone っていうのでコピーするみたいです。&lt;br /&gt;なので、acPoly.Erase(True) の代わりに以下を記述したところ、無事コピーされました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Dim acPolyClone As Polyline = acPoly.Clone()&lt;br /&gt;&lt;br /&gt;acBlkTblRec.AppendEntity(acPolyClone)&lt;br /&gt;acTrans.AddNewlyCreatedDBObject(acPolyClone, True)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ただし、まったく同じ場所にコピーされるので、もとのポリラインと重なっています。&lt;br /&gt;他の場所にコピーしたいときは、どうするんだろう？？？移動と組み合わせるのかな？？？&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;そこで、移動を行うサンプルを見てみたところ、移動する場所を示すマトリックスを作ってから移動するようです。&lt;br /&gt;そこで、以下のように記述を変更して実行してみたところ、無事に コピー＋移動 を行うことができました。（基点が 0,0 で、目的点が 2,0）&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Dim acPolyClone As Polyline = acPoly.Clone()&lt;br /&gt;&lt;br /&gt;Dim acPt3d As Point3d = New Point3d(0, 0, 0)&lt;br /&gt;Dim acVec3d As Vector3d = acPt3d.GetVectorTo(New Point3d(2, 0, 0))&lt;br /&gt;acPolyClone.TransformBy(Matrix3d.Displacement(acVec3d))&lt;br /&gt;&lt;br /&gt;acBlkTblRec.AppendEntity(acPolyClone)&lt;br /&gt;acTrans.AddNewlyCreatedDBObject(acPolyClone, True)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ここで、ちょっと疑問に思ったのが、この例ではプログラムで作成したオブジェクトを移動しましたが、元からあるオブジェクトを選択して、移動したいときはどうなるんでしょう？？？&lt;br /&gt;AutoLISP だと、entsel とか使うやつです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;サンプルを探してみたところ、きっと&amp;nbsp;GetSelection ってやつですね。&lt;br /&gt;そこで、前述の代わりに、以下を記述してみたところ、オブジェクトの選択を求められて、それを移動することができました。&lt;br /&gt;&lt;br /&gt;※ このとき、「Imports Autodesk.AutoCAD.EditorInput」 も追加しました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;'' Request for objects to be selected in the drawing area&lt;br /&gt;Dim acSSPrompt As PromptSelectionResult = acDoc.Editor.GetSelection()&lt;br /&gt;&lt;br /&gt;'' If the prompt status is OK, objects were selected&lt;br /&gt;If acSSPrompt.Status = PromptStatus.OK Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim acSSet As SelectionSet = acSSPrompt.Value&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;'' Step through the objects in the selection set &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;For Each acSSObj As SelectedObject In acSSet&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Check to make sure a valid SelectedObject object was returned &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If Not IsDBNull(acSSObj) Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Open the selected object for write &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acEnt As Entity = acTrans.GetObject(acSSObj.ObjectId, OpenMode.ForWrite)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If Not IsDBNull(acEnt) Then&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acClone As Entity = acEnt.Clone()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acPt3d As Point3d = New Point3d(0, 0, 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acVec3d As Vector3d = acPt3d.GetVectorTo(New Point3d(2, 0, 0))&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acClone.TransformBy(Matrix3d.Displacement(acVec3d))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acBlkTblRec.AppendEntity(acClone)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acTrans.AddNewlyCreatedDBObject(acClone, True)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Next&lt;br /&gt;End If&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;まだちゃんと理解できたわけではありませんが、とりあえず、オブジェクトの作成、削除、コピー、移動を実行するプログラムは作れるようになりました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;今後も、どんどん進んでいこうと思います。&lt;br /&gt;きっとそのうち、自然と理解できるるようになるだろうと期待してます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-7397678519609313261?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/7397678519609313261/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/04/net-autocad-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/7397678519609313261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/7397678519609313261'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/04/net-autocad-2011.html' title='.NET の勉強 「オブジェクトの削除、コピー、移動」（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-8425336647371011949</id><published>2010-04-09T09:00:00.000+09:00</published><updated>2011-01-05T20:13:22.473+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET の勉強 「線分、円、MTEXT の作成」（AutoCAD 2011）</title><content type='html'>今日は、ながーらくサボっていた .NET の勉強を、やっと再開したので、そこのとについてです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;今回は、何か図形を描いてみたいと思って、サンプル ファイルを探してみました。&lt;br /&gt;まずは、基本からなので、線分を作成する以下のサンプル見つけて、それをやってみました。&lt;br /&gt;（プロジェクトの作成は、&lt;a href="http://blog.acadvideo.com/2010/02/microsoft-visual-studio-2008-standard.html"&gt;以前書いた手順&lt;/a&gt;で行いました。）&lt;br /&gt;&lt;blockquote&gt;Imports Autodesk.AutoCAD.Runtime&lt;br /&gt;Imports Autodesk.AutoCAD.ApplicationServices&lt;br /&gt;Imports Autodesk.AutoCAD.DatabaseServices&lt;br /&gt;Imports Autodesk.AutoCAD.Geometry&lt;br /&gt;&lt;br /&gt;&amp;lt;CommandMethod("AddLine")&amp;gt;&amp;nbsp;_&lt;br /&gt;Public Sub AddLine()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;'' Get the current document and database&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Dim acCurDb As Database = acDoc.Database&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;'' Start a transaction&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Open the Block table for read&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acBlkTbl As BlockTable&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Open the Block table record Model space for write&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acBlkTblRec As BlockTableRecord&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;OpenMode.ForWrite)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Create a line that starts at 5,5 and ends at 12,3&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acLine As Line = New Line(New Point3d(5, 5, 0), _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;New Point3d(12, 3, 0))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acLine.SetDatabaseDefaults()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Add the new object to the block table record and the transaction&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acBlkTblRec.AppendEntity(acLine)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acTrans.AddNewlyCreatedDBObject(acLine, True)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Save the new object to the database&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acTrans.Commit()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;End Using&lt;br /&gt;End Sub&lt;/blockquote&gt;線分１本描くのにいろいろやらなきゃいけないんですね。&lt;br /&gt;確かに 5,5 から 12,3 の線分が描けましたが、何やってるんでしょう？？？&lt;br /&gt;管理人には難しすぎて、ほとんど理解不能です。。。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;オンライン ヘルプに、こんな絵が載ってました。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_-VEZIC7K5VU/S72AGl9icKI/AAAAAAAAAOU/r53cskYTz3o/s1600/Understand+the+AutoCAD+Object+Hierarchy.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://4.bp.blogspot.com/_-VEZIC7K5VU/S72AGl9icKI/AAAAAAAAAOU/r53cskYTz3o/s400/Understand+the+AutoCAD+Object+Hierarchy.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;サンプルでは、Document、Database、Block table、Block table record の順番に開いているのは、この絵の順番なんだろうか？？？きっとそうだ。そう思おう。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ということで、あんまり難しいことを理解しようとすると、何も前に進まないので、「'' Create a line that starts at 5,5 and ends at 12,3」のところの作図部分だけをいろいろいじってみることにしました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;どういじったかというと、試しに、もうひとつの線分と 円と MTEXT を描くために、こんな内容を追加してみました。&lt;br /&gt;&lt;blockquote&gt;Dim L1 As Line = New Line()&lt;br /&gt;L1.SetDatabaseDefaults()&lt;br /&gt;L1.StartPoint = New Point3d(0, 0, 0)&lt;br /&gt;L1.EndPoint = New Point3d(100, 100, 0)&lt;br /&gt;&lt;br /&gt;acBlkTblRec.AppendEntity(L1)&lt;br /&gt;acTrans.AddNewlyCreatedDBObject(L1, True)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dim c1 As Circle = New Circle()&lt;br /&gt;c1.SetDatabaseDefaults()&lt;br /&gt;c1.Center = New Point3d(50, 50, 0)&lt;br /&gt;c1.Radius = 20&lt;br /&gt;c1.ColorIndex = 1&lt;br /&gt;c1.Normal = Vector3d.ZAxis&lt;br /&gt;&lt;br /&gt;acBlkTblRec.AppendEntity(c1)&lt;br /&gt;acTrans.AddNewlyCreatedDBObject(c1, True)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dim mt1 As MText = New MText()&lt;br /&gt;mt1.SetDatabaseDefaults()&lt;br /&gt;mt1.Location = New Point3d(50, 50, 0)&lt;br /&gt;mt1.Width = 100.0&lt;br /&gt;mt1.TextHeight = 10.0&lt;br /&gt;mt1.Contents = "てすとです。"&lt;br /&gt;&lt;br /&gt;acBlkTblRec.AppendEntity(mt1)&lt;br /&gt;acTrans.AddNewlyCreatedDBObject(mt1, True)&lt;/blockquote&gt;これで、実行してみたところ、無事 線分、円、MTEXT を作成することができました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;各オブジェクトを宣言したあと、それぞれのプロパティを指定してあげれば、オブジェクトを作成できるようです。&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;線分の場合は、L1 を宣言して、L1 の始点、終点 を指定しました。&lt;/li&gt;&lt;li&gt;円の場合は、c1 を宣言して、c1 の中心点、半径、色、法線方向 を指定しました。&lt;/li&gt;&lt;li&gt;MTEXT の場合は、mt1 を宣言して、文字の位置、幅、文字高さ、文字 を指定しました。&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;なんとなく、コツがつかめたような感じがします。他のオブジェクトもこんな感じで描けると思います。&lt;br /&gt;意味が分からないところがありますが、とりあえず図形は描けるようになりました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;まだ勉強を始めたばかりなので、分からないところばかりにこだわらずに、これからもどんどん次に進んでいこうかと思います。&lt;br /&gt;&lt;br /&gt;※ これから、毎週金曜日は .NET の日にしようかなぁー、、、と思ってたりします。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-8425336647371011949?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/8425336647371011949/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/04/net-mtext-autocad-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/8425336647371011949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/8425336647371011949'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/04/net-mtext-autocad-2011.html' title='.NET の勉強 「線分、円、MTEXT の作成」（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-VEZIC7K5VU/S72AGl9icKI/AAAAAAAAAOU/r53cskYTz3o/s72-c/Understand+the+AutoCAD+Object+Hierarchy.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-9144099244019278615</id><published>2010-03-16T18:31:00.000+09:00</published><updated>2011-01-05T20:13:26.658+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>AutoCAD Managed VB Application Wizard を使用しての .NET プロジェクトの作成（AutoCAD 2011）</title><content type='html'>長らく .NET の勉強をサボっていたので、久しぶりに再開です。&lt;br /&gt;&lt;br /&gt;AutoCAD Managed VB Application Wizard っていうのを使って、.NET プロジェクトを作成できるらしいのですが、それを試してみたいと思います。&lt;br /&gt;&lt;br /&gt;AutoCAD Managed VB Application Wizard&amp;nbsp;が何かまだ良くわかっていないのですが、とりあえず ここ からダウンロードです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-9144099244019278615?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/9144099244019278615/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/03/autocad-managed-vb-application-wizard.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/9144099244019278615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/9144099244019278615'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/03/autocad-managed-vb-application-wizard.html' title='AutoCAD Managed VB Application Wizard を使用しての .NET プロジェクトの作成（AutoCAD 2011）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-38826625678337323</id><published>2010-02-18T14:02:00.001+09:00</published><updated>2011-01-11T21:49:15.403+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Microsoft Visual Studio 2008 Standard Edition を使用してのカスタマイズ（AutoCAD 2010）</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;先日より、.NET の勉強を始めています。&lt;br /&gt;&lt;br /&gt;初心者ということもあり、無償版の&amp;nbsp;Microsoft Visual Studio 2008 Express Edition を使用していたのですが、AutoCAD 2010 のカスタマイズで使えるけどサポートされないということと、デバッグのやり方が分からなかったので、思い切って&amp;nbsp;Microsoft Visual Studio 2008 Standard Edition を購入しました。&lt;br /&gt;&lt;br /&gt;そこで早速、他のサンプルを試してみようと思います。&lt;br /&gt;&lt;a href="" name="more"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;acad_mdg.chm を適当に探して、以下のサンプルをやってみることにしました。&lt;br /&gt;&lt;br /&gt;------------------------------------------&lt;br /&gt;この例では、Add メソッドを使用して、acad.dwt 図面テンプレート ファイルに基づいて新しい図面を作成します。&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Imports Autodesk.AutoCAD.ApplicationServices&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Imports Autodesk.AutoCAD.DatabaseServices&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Imports Autodesk.AutoCAD.Runtime&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;CommandMethod("NewDrawing", CommandFlags.Session)&amp;gt; _&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Public Sub NewDrawing()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&amp;nbsp;&amp;nbsp;'' Specify the template to use, if the template is not found&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&amp;nbsp;&amp;nbsp;'' the default settings are used.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&amp;nbsp;&amp;nbsp;Dim strTemplatePath As String = "acad.dwt"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&amp;nbsp;&amp;nbsp;Dim acDocMgr As DocumentCollection = Application.DocumentManager&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&amp;nbsp;&amp;nbsp;Dim acDoc As Document = acDocMgr.Add(strTemplatePath)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&amp;nbsp;&amp;nbsp;acDocMgr.MdiActiveDocument = acDoc&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;End Sub&lt;/span&gt;&lt;br /&gt;------------------------------------------&lt;br /&gt;&lt;ol&gt;&lt;li&gt;まずは、Visual Studio 2008 を起動します。&lt;/li&gt;&lt;li&gt;[ファイル] - [新しいプロジェクト] を選択して、[新しいプロジェクト] ダイアログで [クラス ライブラリ] を選択して [OK] ボタンをクリックです。（プロジェクト名は、NewDrawing&amp;nbsp;にしました。）&lt;/li&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_-VEZIC7K5VU/S3zFJmTvDSI/AAAAAAAAAIc/SJWI1pQuVLc/s1600-h/%E6%96%B0%E3%81%97%E3%81%84%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%83%83%E3%82%AF%E3%81%A8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/_-VEZIC7K5VU/S3zFJmTvDSI/AAAAAAAAAIc/SJWI1pQuVLc/s400/%E6%96%B0%E3%81%97%E3%81%84%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%83%83%E3%82%AF%E3%81%A8.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;li&gt;例のごとく、サンプル プログラムを Class1.vb にカット＆ペーストして以下のようにします。&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Imports Autodesk.AutoCAD.ApplicationServices&lt;/span&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="white-space: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Imports&lt;br /&gt;Autodesk.AutoCAD.DatabaseServices&lt;br /&gt;Imports Autodesk.AutoCAD.Runtime&lt;br /&gt;&lt;br /&gt;Public Class Class1&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;CommandMethod("NewDrawing", CommandFlags.Session)&amp;gt; _&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Public Sub NewDrawing()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' Specify the template to use, if the template is not found&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'' the default settings are used.&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim strTemplatePath As String = "acad.dwt"&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acDocMgr As DocumentCollection = Application.DocumentManager&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim acDoc As Document = acDocMgr.Add(strTemplatePath)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acDocMgr.MdiActiveDocument = acDoc&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;End Sub&lt;br /&gt;End Class&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;最初は [ソリューション エクスプローラ] に「参照設定」が表示されていないので、[すべてのファイルを表示] ボタンをクリックして表示します。&lt;/li&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_-VEZIC7K5VU/S3ylxagnOkI/AAAAAAAAAG8/bvag18uv-g0/s1600-h/%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3+%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="165" src="http://3.bp.blogspot.com/_-VEZIC7K5VU/S3ylxagnOkI/AAAAAAAAAG8/bvag18uv-g0/s200/%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3+%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;li&gt;そうすると、以下のように「参照設定」が表示されました。&lt;/li&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_-VEZIC7K5VU/S3ymV6N9MxI/AAAAAAAAAHE/Q4N6H9Tl3uU/s1600-h/%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3+%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A92.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="172" src="http://3.bp.blogspot.com/_-VEZIC7K5VU/S3ymV6N9MxI/AAAAAAAAAHE/Q4N6H9Tl3uU/s200/%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3+%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A92.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;li&gt;[参照設定] を右クリックして、[参照の追加] をクリックです。  例のごとく、[参照の追加] ダイアログで [参照] タブを選択して、C:\Program Files\AutoCAD 2010 フォルダにある AcDbMgd.dll を選択して [OK] です。&lt;/li&gt;&lt;li&gt;同じように、AcMgd.dll も追加します。（このサンプルでは、AcCui.dll は追加する必要はないようです。）&lt;/li&gt;&lt;li&gt;[ファイル] - [すべてを保存] を選択して&amp;nbsp;NewDrawing というソリューション名で保存しました。&lt;/li&gt;&lt;/div&gt;&lt;/ol&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_-VEZIC7K5VU/S3zBa55lzTI/AAAAAAAAAIE/XEwIm-VGPyE/s1600-h/%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BF%9D%E5%AD%98.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="96" src="http://3.bp.blogspot.com/_-VEZIC7K5VU/S3zBa55lzTI/AAAAAAAAAIE/XEwIm-VGPyE/s400/%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BF%9D%E5%AD%98.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;では、さっそくデバッグしてみましょう。  &lt;br /&gt;&lt;ol&gt;&lt;li&gt;まずは、デバッグ時に AutoCAD を起動するための設定です。&lt;br /&gt;[ソリューション エクスプローラ] で&amp;nbsp;NewDrawing&amp;nbsp;を右クリックして [プロパティ] を選択します。&lt;/li&gt;&lt;li&gt;デバッグを選択して、[外部プログラムの開始] に&amp;nbsp;C:\Program Files\AutoCAD 2010\acad.exe を設定します。（設定したあと、[選択されたファイルを上書き保存] ボタンをクリックしておきました。）&lt;/li&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_-VEZIC7K5VU/S3zCJtuC1-I/AAAAAAAAAIM/X37bcC_g840/s1600-h/%E3%83%87%E3%83%90%E3%83%83%E3%82%B0.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="http://3.bp.blogspot.com/_-VEZIC7K5VU/S3zCJtuC1-I/AAAAAAAAAIM/X37bcC_g840/s400/%E3%83%87%E3%83%90%E3%83%83%E3%82%B0.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;li&gt;ここで、いよいよ [デバッグ開始] ボタンをクリックです。 &lt;/li&gt;&lt;li&gt;AutoCAD 2010 が起動してきましたが、「アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。．．．」というエラーが表示されました。&lt;br /&gt;そのため、一旦デバッグ中止です。&lt;/li&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_-VEZIC7K5VU/S3y0Wk2N6uI/AAAAAAAAAHk/5RWMbACtu08/s1600-h/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BE%8B%E5%A4%96.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="172" src="http://2.bp.blogspot.com/_-VEZIC7K5VU/S3y0Wk2N6uI/AAAAAAAAAHk/5RWMbACtu08/s400/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BE%8B%E5%A4%96.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;li&gt;どうやら、デバッグするためには参照設定した acdbmgr と acmgd の参照プロパティーで [ローカル コピー] を True から False に変更しなきゃいけないみたいです。&lt;br /&gt;なので、そのとおり変更しました。&lt;/li&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_-VEZIC7K5VU/S3y15vNJhHI/AAAAAAAAAHs/zYg5vNal4Ww/s1600-h/%E5%8F%82%E7%85%A7%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/_-VEZIC7K5VU/S3y15vNJhHI/AAAAAAAAAHs/zYg5vNal4Ww/s200/%E5%8F%82%E7%85%A7%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3.jpg" width="155" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_-VEZIC7K5VU/S3y28-lbfqI/AAAAAAAAAH0/f3b6Iy96KrU/s1600-h/%E5%8F%82%E7%85%A7%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A32.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/_-VEZIC7K5VU/S3y28-lbfqI/AAAAAAAAAH0/f3b6Iy96KrU/s200/%E5%8F%82%E7%85%A7%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A32.jpg" width="146" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;li&gt;ここで、再度&amp;nbsp;[デバッグ開始] ボタンをクリックです。&lt;br /&gt;AutoCAD 2010 が起動してきて、今度はエラーなしです。&lt;/li&gt;&lt;li&gt;NETLOAD コマンドを実行して、Debug フォルダにある NewDrawing.dll&amp;nbsp;をロードします。&lt;/li&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_-VEZIC7K5VU/S3zDO1oJWhI/AAAAAAAAAIU/PWxRTiUC81E/s1600-h/.NET+%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%AA%E3%82%92%E9%81%B8%E6%8A%9E.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="243" src="http://3.bp.blogspot.com/_-VEZIC7K5VU/S3zDO1oJWhI/AAAAAAAAAIU/PWxRTiUC81E/s400/.NET+%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%AA%E3%82%92%E9%81%B8%E6%8A%9E.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;li&gt;NewDrawing コマンドを実行すると、問題なく新規図面が開かれました。&lt;/li&gt;&lt;/div&gt;&lt;/ol&gt;&lt;div&gt;&lt;div&gt;試しにブレーク ポイントを「Dim strTemplatePath As String = "acad.dwt"」の行に設定して&amp;nbsp;NewDrawing コマンドを実行したところ、ちゃんとその行で止まりました。&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;動画も作りました。&lt;/b&gt;&lt;br /&gt;&lt;object height="295" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/elEtO8uhCIw&amp;hl=ja_JP&amp;fs=1&amp;rel=0&amp;color1=0xe1600f&amp;color2=0xfebd01&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/elEtO8uhCIw&amp;hl=ja_JP&amp;fs=1&amp;rel=0&amp;color1=0xe1600f&amp;color2=0xfebd01&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-38826625678337323?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/38826625678337323/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/02/microsoft-visual-studio-2008-standard.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/38826625678337323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/38826625678337323'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/02/microsoft-visual-studio-2008-standard.html' title='Microsoft Visual Studio 2008 Standard Edition を使用してのカスタマイズ（AutoCAD 2010）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-VEZIC7K5VU/S3zFJmTvDSI/AAAAAAAAAIc/SJWI1pQuVLc/s72-c/%E6%96%B0%E3%81%97%E3%81%84%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%83%83%E3%82%AF%E3%81%A8.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-9217760630219381667</id><published>2010-02-10T12:00:00.000+09:00</published><updated>2011-01-05T21:42:12.667+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoLISP'/><title type='text'>よく使う関数を使用してのサンプル ファイル（AutoCAD 2010）</title><content type='html'>&amp;nbsp;以下内容を拡張子 lsp という名前で保存し、ロードして sample1 コマンドを実行すると、寸法が存在すれば「寸法」画層に移動されます。（「寸法」画層が存在しなければ、作成されます。）&lt;br /&gt;&lt;br /&gt;(defun c:sample1 (/ ss ss_len)&lt;br /&gt;; コマンド名を sample1 とし、他に影響がないように、変数 ss ss_len をローカル変数にします。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(if (setq ss (ssget "X" '((0 . "DIMENSION"))))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;; もし、寸法が存在すれば以下の progn で囲まれた部分を実行します。&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;(progn&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(if (not (tblsearch "LAYER" "寸法"))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; もし、「寸法」という画層がなければ以下を実行します。（「寸法」画層を作成します。）&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(command "_.LAYER" "N" "寸法" "")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; すべての寸法の画層を「寸法」に変更します。&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(command "_.CHANGE" ss "" "P" "LA" "寸法" "")&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; 寸法の数を求めます。&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(setq ss_len (sslength ss))&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;; 移動した寸法の数を表示します。strcat 関数は、文字列同士をくっつける関数です。&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(alert (strcat (itoa ss_len) " 個の寸法を「寸法」画層に移動しました。"))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;; もし、寸法が存在しなければ以下の progn で囲まれた部分を実行します。&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;(progn&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(alert "寸法がひとつもありませんでした。")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(princ)&lt;br /&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-9217760630219381667?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/9217760630219381667/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/02/autocad-2010_10.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/9217760630219381667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/9217760630219381667'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/02/autocad-2010_10.html' title='よく使う関数を使用してのサンプル ファイル（AutoCAD 2010）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-7962092050144501188</id><published>2010-02-09T12:00:00.000+09:00</published><updated>2011-01-05T21:42:12.669+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoLISP'/><title type='text'>tblnext、tblsearch 関数（AutoCAD 2010）</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;div&gt;シンボル テーブル（VPORT、LINETYPE、LAYER、STYLE、DIMSTYLE、BLOCKS、APPID）の情報を取得するために使用する関数です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;図面中に「ある画層は存在する？」、「どんな寸法スタイル名がある？」などを確認したいときに使用します。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;使用例&lt;/b&gt;&lt;/div&gt;&lt;div&gt;(tblname &amp;lt;シンボル テーブル&amp;gt; [rewind])&lt;/div&gt;&lt;div&gt;&amp;lt;シンボル テーブル&amp;gt; で指定したシンボル テーブルに設定されているものを順番に返します。&lt;/div&gt;&lt;div&gt;[rewind] の部分は省略可能です。T を入れると、このシンボル テーブルの最初の設定が返されます。&lt;/div&gt;&lt;div&gt;例えば、以下のような使い方になります。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(tblnext "LAYER" T) &amp;nbsp; &amp;nbsp;; T を最後に入れていますので、図面中の最初の画層の情報が返されます。&lt;/div&gt;&lt;div&gt;(tblnext "LAYER") &amp;nbsp; &amp;nbsp;; 図面中の 2 番目の画層の情報が返されます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;このあと、(tblnext "LAYER") &amp;nbsp;を繰り返して実行すると、3 番目、4 番目、・・・と順番に情報が返されます。&lt;/div&gt;&lt;div&gt;もう画層がなくなったときは、nil が返されます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(tblsearch &amp;lt;シンボル テーブル&amp;gt; &amp;lt;名前&amp;gt; [setnext])&lt;/div&gt;&lt;div&gt;&amp;lt;シンボル テーブル&amp;gt; で指定したシンボル テーブルに ＜名前＞ で指定した名前が存在すれば、その情報が返され、なければ nil が返されます。&lt;/div&gt;&lt;div&gt;例えば、以下を実行したとします。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(tblsearch "DIMSTYLE" "TEST")&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;図面中に、TEST という寸法スタイルが存在すれば、その情報が返され、なければ nil が返されます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;[setnext] の部分は省略可能です。T を入れると、このあとに tblnext 関数を実行すると、tblsearch 関数で返されたシンボル テーブルのつぎのシンボル テーブルの情報が返されるようになります。&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-7962092050144501188?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/7962092050144501188/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/02/tblnexttblsearch-autocad-2010.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/7962092050144501188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/7962092050144501188'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/02/tblnexttblsearch-autocad-2010.html' title='tblnext、tblsearch 関数（AutoCAD 2010）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-6179477122541302563</id><published>2010-02-07T12:00:00.001+09:00</published><updated>2011-01-05T21:42:12.672+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoLISP'/><title type='text'>defun 関数（AutoCAD 2010）</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;div&gt;自分で新たに作成する関数を定義する関数です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;使用例&lt;/b&gt;&lt;/div&gt;&lt;div&gt;(defun sym (&amp;lt;引数&amp;gt; / &amp;lt;ローカル変数&amp;gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;autolisp 式=""&gt;&lt;/autolisp&gt;&lt;/div&gt;&lt;div&gt;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;sym は自分で新たに作成する関数の名前です。&lt;/div&gt;&lt;div&gt;例えば、test にすると、AutoCAD 上 あるいは AutoLISP のプログラム内で (test) と入力すると実行されます。&lt;/div&gt;&lt;div&gt;また、c:test にすると、コマンドとして定義されることになります。そのため、AutoCAD 上で test と入力すると実行されます。AutoLISP のプログラム内では (c:test) と入力すると実行されます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;引数&amp;gt; は関数を実行する時の引数です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;ローカル変数&amp;gt;&lt;/div&gt;&lt;div&gt;ローカル変数とは、この関数の実行中にのみ設定される変数で、この関数が完了したあとは設定がなくなる変数です。（ローカル変数の逆は、グローバル変数です。）&lt;/div&gt;&lt;div&gt;例えば、以下の 2 つの例で違いを見てみましょう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;例 1&amp;gt;&lt;/div&gt;&lt;div&gt;(defun c:test1 (/ pt1 pt2)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(setq pt1 '(0.0 0.0 0.0))&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(setq pt2 '(100.0 100.0 0.0))&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(command "_.LINE" pt1 pt2 "")&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(princ)&lt;/div&gt;&lt;div&gt;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;例 2&amp;gt;&lt;/div&gt;&lt;div&gt;(defun c:test2 ()&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(setq pt1 '(0.0 0.0 0.0))&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(setq pt2 '(100.0 100.0 0.0))&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(command "_.LINE" pt1 pt2 "")&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(princ)&lt;/div&gt;&lt;div&gt;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;例 1 の test1 コマンドを実行したあとは、変数 pt1 と pt2 が nil に戻ります。&lt;/div&gt;&lt;div&gt;例 2 の test2 コマンドを実行したあとは、変数 pt1 には (0.0 0.0 0.0) が、変数 pt2 には (100.0 100.0 0.0) が設定されたままになります。&lt;/div&gt;&lt;div&gt;（AutoCAD のコマンド ラインに !pt1 や !pt2 と入力することにより確認できます。）&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ローカル変数であれば、他の関数実行時にその設定が影響することはありません。&lt;/div&gt;&lt;div&gt;グローバル変数は、他の関数で同じ変数名を使用していると、その設定が影響することがあります。&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-6179477122541302563?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/6179477122541302563/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/02/defun-autocad-2010.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/6179477122541302563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/6179477122541302563'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/02/defun-autocad-2010.html' title='defun 関数（AutoCAD 2010）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-1978483948172180470</id><published>2010-02-06T12:00:00.002+09:00</published><updated>2011-01-05T21:42:12.675+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoLISP'/><title type='text'>ssget、ssname、sslength 関数（AutoCAD 2010）</title><content type='html'>&amp;nbsp;ユーザにオブジェクトを複数選択させたり、ある条件にあったオブジェクトを複数選択してそれらの情報を取得したいことがあると思います。&lt;br /&gt;&lt;br /&gt;例えば、ユーザが選択した複数のオブジェクトの画層、色、線種などの情報を取得したり、図面の中の寸法図形のみを抽出して、その画層などの上方を取得したいといったような時です。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;使用例&lt;/b&gt;&lt;br /&gt;(ssget)&lt;br /&gt;コマンド ラインに「オブジェクトを選択：」と表示されます。&lt;br /&gt;ここで、オブジェクトを選択すると、選択したオブジェクトの選択セットが返されます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(ssget "X" &amp;lt;条件&amp;gt;)&lt;br /&gt;&amp;lt;条件&amp;gt; の部分に当てはまるすべてのオブジェクトを含んだ選択セットが返されます。&lt;br /&gt;例えば、(ssget "X" '((0 . "DIMENSION"))) と実行すると、図面中に含まれるすべての寸法図形を含んだ選択セットが返されます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(ssname ss index)&lt;br /&gt;選択セット ss の index で指定した番号の要素の図形名が返されます。&lt;br /&gt;index は、0 から始まります。&lt;br /&gt;&lt;br /&gt;例えば、以下を実行したとします。&lt;br /&gt;&lt;br /&gt;(setq ss (ssget "X" '((0 . "LINE"))))&lt;br /&gt;(setq obj_1 (ssname ss 0))&lt;br /&gt;(setq obj_2 (ssname ss 1))&lt;br /&gt;&lt;br /&gt;そうすると、変数 ss に図面中のすべての線分を含んだ選択セットが設定され、変数 obj_1 にはその選択セットの 最初の線分の図形名、変数 obj_2 にはその選択セットの 2 番目の図形名が設定されます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(sslength ss)&lt;br /&gt;選択セット ss に含まれるオブジェクトの数が返されます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-1978483948172180470?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/1978483948172180470/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/02/ssgetssnamesslength-autocad-2010.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/1978483948172180470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/1978483948172180470'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/02/ssgetssnamesslength-autocad-2010.html' title='ssget、ssname、sslength 関数（AutoCAD 2010）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-7013460375136290803</id><published>2010-02-06T12:00:00.001+09:00</published><updated>2011-01-05T21:42:12.676+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoLISP'/><title type='text'>If、while、cond 関数（AutoCAD 2010）</title><content type='html'>プログラムを作成するとき、「もし～なら***、そうでないなら***」とか「～の間は繰り返す」とか「A のときは***、B のときは***、C のときは***」といった条件文を作成する必要がでてくると思います。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;使用例&lt;/b&gt;&lt;br /&gt;(if &amp;lt;条件&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;条件&amp;gt; が真の場合に実行する内容&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;条件&amp;gt; が偽の場合に実行する内容&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;例えば以下の内容を test.lsp というファイルとして保存し、ロードして test コマンドを実行したとします。&lt;br /&gt;&lt;br /&gt;(defun C:TEST ()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(setq a (getint "\n数値を入力："))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(if (&amp;gt;= a 10)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;(alert "10 以上の数値が入力されました。")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;(alert "10 未満の数値が入力されました。")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;)&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;そうすると、「数値を入力：」に対して 10 以上の数値を入力すると、「10 以上の数値が入力されました。」と表示され、10 未満の数値を入力すると、「10 未満の数値が入力されました。」と表示されます。&lt;br /&gt;&lt;br /&gt;＜注意！！＞&lt;br /&gt;&amp;lt;条件&amp;gt; が真 または 偽の場合に実行する内容が複数の場合は、progn でまとめる必要があります。以下に例を示します。&lt;br /&gt;&lt;br /&gt;(defun C:TEST ()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(setq a (getint "\n数値を入力："))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(if (&amp;gt;= a 10)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;(progn&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;(alert "10 以上の数値が入力されました。")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;(alert "以上でコマンド終了です。")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;(progn&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;(alert "10 未満の数値が入力されました。")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;(alert "以上でコマンド終了です。")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;)&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(while &amp;lt;条件&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;条件&amp;gt; に当てはまる場合に実行する内容&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;例えば以下の内容を test.lsp というファイルとして保存し、ロードして test コマンドを実行したとします。&lt;br /&gt;&lt;br /&gt;(defun C:TEST ()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(setq n 5)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(while (&amp;gt; n 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;(alert "while 文実行中です。")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;(setq n (- n 1))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;)&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;そうすると、「while 文実行中です。」という表示が 5 回繰り返し表示されます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(cond&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;条件1&amp;gt;&amp;lt;条件1 の場合に実行する内容&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;条件2&amp;gt;&amp;lt;条件2 の場合に実行する内容&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;条件3&amp;gt;&amp;lt;条件3 の場合に実行する内容&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;・&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;・&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;T &amp;lt;どの条件にも当てはまらない場合に実行する内容&amp;gt;&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;例えば以下の内容を test.lsp というファイルとして保存し、ロードして test コマンドを実行したとします。&lt;br /&gt;&lt;br /&gt;(defun C:TEST ()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(setq a (getint "\n数値を入力："))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(cond&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;((= a 1) (alert "1 が入力されました。"))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;((= a 2) (alert "2 が入力されました。"))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;((= a 3) (alert "3 が入力されました。"))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;(T (alert "1 でも 2 でも 3 でもない数値が入力されました。"))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;)&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;そうすると、「数値を入力：」に対して 1（または 2 や 3）を入力すると、「1 （または 2 や 3）が入力されました。」と表示され、1、2、3 以外の数値を入力すると、「1 でも 2 でも 3 でもない数値が入力されました。」と表示されます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-7013460375136290803?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/7013460375136290803/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/02/ifwhilecond-autocad-2010.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/7013460375136290803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/7013460375136290803'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/02/ifwhilecond-autocad-2010.html' title='If、while、cond 関数（AutoCAD 2010）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-3485737583386949722</id><published>2010-02-05T12:00:00.000+09:00</published><updated>2011-01-05T21:42:12.679+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoLISP'/><title type='text'>entsel、entlast、entget 関数（AutoCAD 2010）</title><content type='html'>AutoCAD においてプログラムを作るとき、あるオブジェクトの情報を取得したくなることもあると思います。&lt;br /&gt;例えば、あるオブジェクトの画層、色、線種、文字スタイル名、寸法スタイル名などがどのようになっているかを知りたいときなどです。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;使用例&lt;/b&gt;&lt;br /&gt;オブジェクトの情報を取得したいときは、まずはそのオブジェクトの「図形名」を取得して、それを元にオブジェクトの情報を取得することになります。&lt;br /&gt;&lt;br /&gt;(entsel)&lt;br /&gt;コマンド ラインに「オブジェクトを選択：」と表示されます。&lt;br /&gt;ここで、オブジェクトを選択すると、選択したオブジェクトの「図形名」とクリックした座標値が返されます。&lt;br /&gt;&lt;br /&gt;(entlest)&lt;br /&gt;最後に作成したオブジェクトの「図形名」が返されます。&lt;br /&gt;&lt;br /&gt;(entget (car (entsel)))&lt;br /&gt;選択したオブジェクトの情報が返されます。&lt;br /&gt;car 関数は、リストの最初の要素を返します。(car (entsel)) は、(entsel) の返り値の最初の要素を返すということになりますので、選択したオブジェクトの「図形名」が返されます。&lt;br /&gt;&lt;br /&gt;(entget (car (entsel)) '("*"))&lt;br /&gt;「 '("*")」が追加されていますが、これは、オブジェクトに追加されている拡張データの情報も取得したいときに追加します。「*」となっているのは、すべてのアプリケーション名に対する拡張データも取得するということです。&lt;br /&gt;例えば、acadvideo というアプリケーション名の拡張データだけを取得するときは　(entget (car (entsel)) '("acadvideo")) となります。&lt;br /&gt;&lt;br /&gt;(entget (entlast))&lt;br /&gt;(entget (entlast) '("*"))&lt;br /&gt;最後に作成したオブジェクトの情報が返されます。&lt;br /&gt;「 '("*")」を付けたときは、拡張データも返されます。&lt;br /&gt;&lt;br /&gt;例えば、中心が 100,100 で、半径 50 の円を描き、(entget (entlast)) を実行すると、以下のような情報が返されます。&lt;br /&gt;&lt;br /&gt;((-1 . &amp;lt;図形名: 7ffffb0b830&amp;gt;) (0 . "CIRCLE") (330 . &amp;lt;図形名: 7ffffb099f0&amp;gt;) (5 . &lt;br /&gt;"1FB") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . &lt;br /&gt;"AcDbCircle") (10 100.0 100.0 0.0) (40 . 50.0) (210 0.0 0.0 1.0))&lt;br /&gt;&lt;br /&gt;ちょっとだけ説明すると、&lt;br /&gt;&lt;br /&gt;(0 . "CIRCLE") は、オブジェクトの種類が「円」&lt;br /&gt;(8 . "0") は、画層が 0&lt;br /&gt;(10 100.0 100.0 0.0) は、中心の座標値が 100.0,100.0,0.0&lt;br /&gt;(40 . 50.0) は、半径が 50.0&lt;br /&gt;&lt;br /&gt;ということを示してします。&lt;br /&gt;&lt;object height="295" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/WKvy9WDiNfo&amp;hl=ja_JP&amp;fs=1&amp;rel=0&amp;color1=0xe1600f&amp;color2=0xfebd01&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/WKvy9WDiNfo&amp;hl=ja_JP&amp;fs=1&amp;rel=0&amp;color1=0xe1600f&amp;color2=0xfebd01&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-3485737583386949722?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/3485737583386949722/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/02/entselentlastentget-autocad-2010.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3485737583386949722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/3485737583386949722'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/02/entselentlastentget-autocad-2010.html' title='entsel、entlast、entget 関数（AutoCAD 2010）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-1544581996015001248</id><published>2010-01-25T12:00:00.002+09:00</published><updated>2011-01-11T21:49:30.697+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET（基本）(2)（AutoCAD 2010）</title><content type='html'>&lt;b&gt;サンプル プログラムの解析&lt;/b&gt;&lt;br /&gt;では、使用したサンプル プログラムは具体的に何を行っているのか内容を見ていきましょう。&lt;br /&gt;&lt;a href="" name="more"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ここであらためてサンプル プログラムは以下のとおりです。&lt;br /&gt;--------------------------------------------------&lt;br /&gt;Imports Autodesk.AutoCAD.ApplicationServices&lt;br /&gt;Imports Autodesk.AutoCAD.Runtime&lt;br /&gt;Imports Autodesk.AutoCAD.Geometry&lt;br /&gt;Public Class Class1&lt;br /&gt;&lt;commandmethod("anglefromxaxis")&gt; _&lt;br /&gt;Public Sub AngleFromXAxis()&lt;br /&gt;Dim pt1 As Point2d = New Point2d(2, 5)&lt;br /&gt;Dim pt2 As Point2d = New Point2d(5, 2)&lt;br /&gt;&lt;br /&gt;Application.ShowAlertDialog("Angle from XAxis: " &amp;amp; _&lt;br /&gt;pt1.GetVectorTo(pt2).Angle.ToString())&lt;br /&gt;End Sub&lt;br /&gt;End Class&lt;/commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;commandmethod("anglefromxaxis")&gt;--------------------------------------------------&lt;/commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;b&gt; Imports Autodesk.AutoCAD.ApplicationServices&lt;br /&gt;Imports Autodesk.AutoCAD.Runtime&lt;br /&gt;Imports Autodesk.AutoCAD.Geometry&lt;/b&gt;&lt;/commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;commandmethod("anglefromxaxis")&gt;まずは、これからですが、これは何なんでしょう？&lt;/commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;br /&gt;そこで、Google で Imports について探してみたところ&lt;a href="http://msdn.microsoft.com/ja-jp/library/7f38zh8x.aspx" target="_blank"&gt; http://msdn.microsoft.com/ja-jp/library/7f38zh8x.aspx&lt;/a&gt; にこんな記述がありました。&lt;/commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;/commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;blockquote&gt;現在のプロジェクトに定義された、または参照されているプロジェクトとアセンブリに定義された名前空間またはプログラミング要素をインポートします。&lt;/blockquote&gt;なので、AutoCAD の名前空間ってやつを読み込んでいみたいです。&lt;br /&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;br /&gt;続いて、Autodesk.AutoCAD.ApplicationServices などについて Google で探したところ、ちょっと古い（AutoCAD 2008 のころのもの？）ですが、&lt;a href="http://images.autodesk.com/apac_japan_main/files/api_customizetechnic.pdf" target="_blank"&gt;http://images.autodesk.com/apac_japan_main/files/api_customizetechnic.pdf&lt;/a&gt; を見つけました。でも、基本的に AutoCAD 2010 も同じでしょうと勝手に都合のいいように考えることにしました。&lt;/commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;br /&gt;この中の 30 ページに、こんな記述を見つけました。&lt;/commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;/commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;blockquote&gt;AutoCAD マネージクラスライブラリの名前空間&lt;/blockquote&gt;&lt;blockquote&gt;Autodesk.AutoCAD.GraphicsInterface　：　ベクトル描画機構関連&lt;/blockquote&gt;&lt;blockquote&gt;Autodesk.AutoCAD.PlottingServices　：　印刷サービス関連&lt;/blockquote&gt;&lt;blockquote&gt;Autodesk.AutoCAD.Windows　：　ユーザインタフェース関連&lt;/blockquote&gt;&lt;blockquote&gt;Autodesk.AutoCAD.EditorInput　：　選択、入力等ユーザ対話関連&lt;/blockquote&gt;&lt;blockquote&gt;Autodesk.AutoCAD.Runtime　：　例外処理など基本機能関連&lt;/blockquote&gt;&lt;blockquote&gt;Autodesk.AutoCAD.Geometry　：　幾何演算関連&lt;/blockquote&gt;&lt;blockquote&gt;Autodesk.AutoCAD.DatabaseServices　：　グラフィカル、非グラフィカルオブジェクト等図面データベース関連&lt;/blockquote&gt;これからいくと、2 行目、3 行目で「例外処理など基本機能関連」と「幾何演算関連」の名前空間をインポートしてるってことですね。詳しいことはわかりませんが、このサンプル プログラムではこれらの名前空間を読み込んでおく必要があるみたいです。（プログラムに詳しい人からすれば、基本中の基本で、当たり前のことなんでしょうね、きっと。。。）&lt;br /&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;br /&gt;1 行目の Autodesk.AutoCAD.ApplicationServices についての記述はありませんが、名前から見てきっと必ずいるものなんでしょうね、と勝手に理解することにします。（これ以上考えてもわからないので。。。）&lt;br /&gt;いろいろサンプル ファイルを見てみても、Autodesk.AutoCAD.ApplicationServices と Autodesk.AutoCAD.Runtime は必ずインポートしてるみたいです。&lt;/commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;/commandmethod("anglefromxaxis")&gt;&lt;/commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;b&gt;&lt;commandmethod("anglefromxaxis")&gt; _&lt;/commandmethod("anglefromxaxis")&gt;&lt;/b&gt; AutoCAD .NET デベロッパガイド（acad_mdg.zip）の「AutoCAD .NET API の基礎 &amp;gt; コマンドと AutoLISP 関数の定義 &amp;gt; コマンドの定義」に記述がありました。&lt;/commandmethod("anglefromxaxis")&gt;&lt;/commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;br /&gt;コマンドの定義を行っているようです。&lt;br /&gt;AngleFromXAxis というコマンドを新たに作りますよってことです。&lt;/commandmethod("anglefromxaxis")&gt;&lt;/commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;b&gt; Dim pt1 As Point2d = New Point2d(2, 5)&lt;br /&gt;Dim pt2 As Point2d = New Point2d(5, 2)&lt;/b&gt;&lt;br /&gt;pt1 と pt2 に 2 次元の座標値を割り当ててるようです。&lt;/commandmethod("anglefromxaxis")&gt;&lt;/commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;b&gt; Application.ShowAlertDialog("Angle from XAxis: " &amp;amp; _&lt;br /&gt;pt1.GetVectorTo(pt2).Angle.ToString())&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.autodesk.com/objectarx" target="_blank"&gt; http://www.autodesk.com/objectarx&lt;/a&gt; の「License &amp;amp; Download」から「ObjectARX for AutoCAD 2010 (32-bit and 64-bit)」(ObjectARX_2010_Win_64_and_32Bit.exe)を入手しました。&lt;/commandmethod("anglefromxaxis")&gt;&lt;/commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;br /&gt;ObjectARX_2010_Win_64_and_32Bit.exe を実行すると C:\ObjectARX 2010\docs フォルダに arxmgd.chm(ObjectARX for AutoCAD 2010 : Managed Class Reference Guide) というファイルがあって、Application.ShowAlertDialog について以下の記述があったので、きっとこれでしょう。&lt;/commandmethod("anglefromxaxis")&gt;&lt;/commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Shows the alert dialog with the specified message.&lt;/blockquote&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;commandmethod("anglefromxaxis")&gt; ※ ここで気がついたのですが、arxmgd.chmで、Autodesk.AutoCAD.ApplicationServices Namespace の下に Application.ShowAlertDialog Method に関する記述があるので、「Imports Autodesk.AutoCAD.ApplicationServices」の記述が必要だったんですね、きっと。&lt;/commandmethod("anglefromxaxis")&gt;&lt;/commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;br /&gt;pt1.GetVectorTo(pt2).Angle.ToString() に関しては、きっと、p1 から p2 までのベクトルの角度を文字列にしているみたいです。（まだ理屈をちゃんと理解してませんが、そのうち分かる時が来ると勝手に思ってます。）&lt;/commandmethod("anglefromxaxis")&gt;&lt;/commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;br /&gt;なので、pt1 から pt2 方向へのベクトルの角度を文字列にしているみたいです。&lt;/commandmethod("anglefromxaxis")&gt;&lt;/commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;br /&gt;pt1 は 2,5、pt2 は 5,2 なので、角度は 315° です。&lt;/commandmethod("anglefromxaxis")&gt;&lt;/commandmethod("anglefromxaxis")&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_-VEZIC7K5VU/S3fzrqU8-lI/AAAAAAAAACU/a3tShzhQOEg/s1600-h/img55.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_-VEZIC7K5VU/S3fzrqU8-lI/AAAAAAAAACU/a3tShzhQOEg/s320/img55.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;commandmethod("anglefromxaxis")&gt;&lt;commandmethod("anglefromxaxis")&gt;この AngleFromXAxis コマンドを実行すると、上記のように表示されていますが、この値はラジアンだと思います。（180 × 5.49778714378214 ÷ π ＝ 315 ですね。）&lt;/commandmethod("anglefromxaxis")&gt;&lt;/commandmethod("anglefromxaxis")&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-1544581996015001248?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/1544581996015001248/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/01/net2autocad-2010.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/1544581996015001248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/1544581996015001248'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/01/net2autocad-2010.html' title='.NET（基本）(2)（AutoCAD 2010）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-VEZIC7K5VU/S3fzrqU8-lI/AAAAAAAAACU/a3tShzhQOEg/s72-c/img55.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-1615318369583346501</id><published>2010-01-23T12:00:00.002+09:00</published><updated>2011-01-11T21:48:47.194+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET（基本）（AutoCAD 2010）</title><content type='html'>&lt;a href="" name="more"&gt;&lt;/a&gt;オートデスク社の Webサイト（Microsoft Visual Basic for Applications Module FAQ）に以下の記述があります。&lt;br /&gt;&lt;blockquote&gt;What is the status of VBA support in the AutoCAD 2010 product line?&lt;br /&gt;Autodesk has begun the transition of VB customization from VBA to .NET technology. This transition will occur over a few years. During this time, Autodesk will provide documentation and other assistance to help our customers and developers migrate from VBA to this new automation technology.&lt;/blockquote&gt;オートデスク社は VBA から .NET への移行を始めているということのようです。&lt;br /&gt;&lt;br /&gt;管理人は、AutoLISP でカスタマイズを行ったことはありますが、その他の言語でのカスタマイズは行ったことがありません。&lt;br /&gt;AutoLISP はずっと昔からある古い言語なので、新しいカスタマイズにチャレンジしようかと思っています。&lt;br /&gt;&lt;br /&gt;そこで、VBA は .NET に移行されるということのようなので、.NET をいちからやってみようと思います。きっと、分からない事だらけで、なかなか進まないと思いますが、地道にコツコツやっていこうかと思います。&lt;br /&gt;&lt;br /&gt;とりあえず管理人がやってみたことをそのまま書くだけですので、あくまでも参考ということで見てください。（初心者なので間違いや勘違いがあると思いますので。。。）&lt;br /&gt;&lt;br /&gt;&lt;b&gt;環境の準備&lt;/b&gt;&lt;br /&gt;まずは、環境の準備から始めようと思いますが、いったい何が必要なのでしょうね？？？（なにぶん初心者なので。。。）&lt;br /&gt;&lt;br /&gt;とりあえず、オートデスク社の Web サイトの &lt;a href="http://usa.autodesk.com/adsk/servlet/item?siteID=1169823&amp;amp;id=8084566#section5" target="_blank"&gt;ここ&lt;/a&gt; に「AutoCAD .NET デベロッパガイド(日本語) 」（acad_mdg.zip）があるので、これをダウンロードして解凍した acad_mdg.chm を C:\Program Files\AutoCAD 2010\Help フォルダに置いて、中を見てみました。&lt;br /&gt;&lt;blockquote&gt;※ Help フォルダに置かないと、ちゃんと内容を表示できないので注意！！&lt;/blockquote&gt;まずは、acad_mdg.chm でこんな記述を見つけました。&lt;br /&gt;&lt;blockquote&gt;Microsoft Visual Studio には複数のバージョンおよびエディションがあります。AutoCAD 2010 対応の .NET API を使用するには、次を使用する必要があります。&lt;/blockquote&gt;&lt;blockquote&gt;・ Microsoft Visual Studio 2008 Service Pack 1&lt;/blockquote&gt;&lt;blockquote&gt;・ Microsoft .NET Framework 3.5 Service Pack 1&lt;/blockquote&gt;管理人の OS は、Windows 7 なので .NET Framework 3.5.1 が元からはいっているので、Microsoft .NET Framework 3.5 Service Pack 1 は気にしなくていいでしょう。（他の OS の場合も、AutoCAD 2010 と一緒にインストールされますから気にしなくていいでしょう。）&lt;br /&gt;&lt;br /&gt;Microsoft Visual Studio 2008 Service Pack 1 に関しては、無償版で Microsoft Visual Studio 2008 Express Edition というものがあるようなので、これにしましょう。（有償版の方がいいようですが、初心者としてはやっぱり無償版がいいです。）&lt;br /&gt;&lt;br /&gt;そこで、&lt;a href="http://www.microsoft.com/japan/msdn/vstudio/express/" target="_blank"&gt;http://www.microsoft.com/japan/msdn/vstudio/express/&lt;/a&gt; から Microsoft Visual Studio 2008 Express Edition を入手してインストールを開始したところ、以下の画面になりました。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_-VEZIC7K5VU/S3fsD830apI/AAAAAAAAABc/_5pG5G7kUUA/s1600-h/img3F.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="322" src="http://1.bp.blogspot.com/_-VEZIC7K5VU/S3fsD830apI/AAAAAAAAABc/_5pG5G7kUUA/s400/img3F.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;どれを選べばいいんでしょうね？？？&lt;br /&gt;とりあえず、Visual Basic 2008 をインストールしてみました。&lt;br /&gt;&lt;br /&gt;では、さっそく Visual Basic 2008 を起動してみました。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_-VEZIC7K5VU/S3fsUXXvBDI/AAAAAAAAABk/39ZFOkoYQkQ/s1600-h/img43.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" src="http://2.bp.blogspot.com/_-VEZIC7K5VU/S3fsUXXvBDI/AAAAAAAAABk/39ZFOkoYQkQ/s400/img43.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;で、このあとどうすればいいんでしょう？？？&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;参照の追加（AcDbMgd.dll、AcMgd.dll、AcCui.dll）&lt;/b&gt;&lt;/div&gt;&lt;div&gt;何が何だかわからないので、とりあえず手探りで [ファイル]-[新しいプロジェクト] を選択したあと、クラス ライブラリを選択して、test01 というプロジェクト名にして OK ボタンをクリックしました。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_-VEZIC7K5VU/S3fsj2CefwI/AAAAAAAAABs/PhYFbEweg3o/s1600-h/img46.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/_-VEZIC7K5VU/S3fsj2CefwI/AAAAAAAAABs/PhYFbEweg3o/s400/img46.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;acad_mdg.chm にこんな記述を発見しました。&lt;/div&gt;&lt;blockquote&gt;AutoCAD .NET API の DLL ファイルのうち、主に次の 3 つを頻繁に使用します。&lt;/blockquote&gt;&lt;blockquote&gt;・ AcDbMgd.dll: 図面ファイル内のオブジェクトの操作に使用します。&lt;/blockquote&gt;&lt;blockquote&gt;・ AcMgd.dll: AutoCAD アプリケーションの操作に使用します。&lt;/blockquote&gt;&lt;blockquote&gt;・ AcCui.dll: カスタマイズ ファイルの操作に使用します。&lt;/blockquote&gt;&lt;div&gt;ということで、[プロジェクト]-[参照の追加] で、[参照] タブを選択して上記の 3 つの dll ファイルを選択して OK ボタンをクリックしました。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_-VEZIC7K5VU/S3ft4DCH1OI/AAAAAAAAAB0/CtNatq7RpsA/s1600-h/img48.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="268" src="http://1.bp.blogspot.com/_-VEZIC7K5VU/S3ft4DCH1OI/AAAAAAAAAB0/CtNatq7RpsA/s400/img48.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;サンプル プログラムを元にして DLL ファイルを作成&lt;/b&gt;&lt;/div&gt;&lt;div&gt;で、まずはサンプルを探してやってみようと思い、acad_mdg.chm を探してこんなコードを見つけました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Imports Autodesk.AutoCAD.ApplicationServices&lt;/div&gt;&lt;div style="text-align: left;"&gt;Imports Autodesk.AutoCAD.Runtime&lt;/div&gt;&lt;div style="text-align: left;"&gt;Imports Autodesk.AutoCAD.Geometry&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;CommandMethod("AngleFromXAxis")&amp;gt; _&lt;/div&gt;&lt;div&gt;Public Sub AngleFromXAxis()&lt;/div&gt;&lt;div&gt;Dim pt1 As Point2d = New Point2d(2, 5)&lt;/div&gt;&lt;div&gt;Dim pt2 As Point2d = New Point2d(5, 2)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Application.ShowAlertDialog("Angle from XAxis: " &amp;amp; _&lt;/div&gt;&lt;div&gt;pt1.GetVectorTo(pt2).Angle.ToString())&lt;/div&gt;&lt;div&gt;End Sub&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ということで、さっそくカット＆ペーストです。&lt;/div&gt;&lt;div&gt;Class1.vb にまるごとカット＆ペーストしてみましたが、「&amp;lt;CommandMethod("AngleFromXAxis")&amp;gt; _&lt;commandmethod("anglefromxaxis")&gt;」と「Public Sub AngleFromXAxis()」に波線が入って、「名前空間のステートメントが無効です。」というエラーになってしまいました。&lt;/commandmethod("anglefromxaxis")&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_-VEZIC7K5VU/S3fvOp8k7pI/AAAAAAAAAB8/5r9htnYrpH0/s1600-h/img4E.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="278" src="http://4.bp.blogspot.com/_-VEZIC7K5VU/S3fvOp8k7pI/AAAAAAAAAB8/5r9htnYrpH0/s400/img4E.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Class1.vb には元々以下の内容があったので、消しちゃいけないんですね、きっと。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Public Class Class1&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;End Class&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ということで、この記述は残して、こんな感じにしました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Imports Autodesk.AutoCAD.ApplicationServices&lt;/div&gt;&lt;div&gt;Imports Autodesk.AutoCAD.Runtime&lt;/div&gt;&lt;div&gt;Imports Autodesk.AutoCAD.Geometry&lt;/div&gt;&lt;div&gt;Public Class Class1&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;CommandMethod("AngleFromXAxis")&amp;gt; _&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Public Sub AngleFromXAxis()&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim pt1 As Point2d = New Point2d(2, 5)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim pt2 As Point2d = New Point2d(5, 2)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Application.ShowAlertDialog("Angle from XAxis: " &amp;amp; _&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pt1.GetVectorTo(pt2).Angle.ToString())&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;End Sub&lt;/div&gt;&lt;div&gt;End Class&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今度は、エラーなしです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;で、[ファイル]-[すべて保存] を選択して、test01 という名前で保存です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;そうすると、C:\Users\acadvideo\Documents\Visual Studio 2008\Projects\test01\test01\bin\Debug フォルダに test01.dll というファイルが出来ました。&lt;/div&gt;&lt;div&gt;これをロードすればいいんですねきっと。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;AutoCAD で実行&lt;/b&gt;&lt;/div&gt;&lt;div&gt;test01.dll ができたので、さっそく AutoCAD で実行です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;まずは、AutoCAD を起動して、NETLOAD[.NET アプリケーション ロード] コマンドを実行です。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_-VEZIC7K5VU/S3fvtkpAlNI/AAAAAAAAACE/KnsZSO_8AtM/s1600-h/img54.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="243" src="http://4.bp.blogspot.com/_-VEZIC7K5VU/S3fvtkpAlNI/AAAAAAAAACE/KnsZSO_8AtM/s400/img54.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;さっきできた test01.dll を選択して、[開く] ボタンをクリックしてロードです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;「&lt;commandmethod("anglefromxaxis")&gt;&amp;lt;CommandMethod("AngleFromXAxis")&amp;gt; _」という記述があったので、AngleFromXAxis と入力すると、作成したコマンド（AngleFromXAxis）が実行されて、 こんな AutoCAD メッセージが表示されました！！&lt;/commandmethod("anglefromxaxis")&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_-VEZIC7K5VU/S3fv69-YSDI/AAAAAAAAACM/WT6ff1QcGp8/s1600-h/img55.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/_-VEZIC7K5VU/S3fv69-YSDI/AAAAAAAAACM/WT6ff1QcGp8/s320/img55.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;なんとかコマンドを作れてよかったです！！&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-1615318369583346501?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/1615318369583346501/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/01/netautocad-2010.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/1615318369583346501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/1615318369583346501'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/01/netautocad-2010.html' title='.NET（基本）（AutoCAD 2010）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-VEZIC7K5VU/S3fsD830apI/AAAAAAAAABc/_5pG5G7kUUA/s72-c/img3F.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-8932028997210775058</id><published>2010-01-22T12:00:00.001+09:00</published><updated>2011-01-05T21:42:12.684+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoLISP'/><title type='text'>getpoint、getint、getreal、getstring 関数（AutoCAD 2010）</title><content type='html'>プログラムを作成するときに、ユーザに座標値、整数値、実数値、文字列を入力させたいことがあると思います。そんな時に、これらの関数を使用します。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;使用例&lt;/b&gt;&lt;br /&gt;(getpoint "\n場所を指定：")&lt;br /&gt;コマンドラインに「場所を指定：」と表示され、その後クリックした（あるいは 入力した）座標値が返されます。&lt;br /&gt;&lt;br /&gt;そのため、例えば、(setq pt1 (getpoint "\n場所を指定：")) と入力すると、ユーザがクリックした座標値が、変数 pt1 に割り当てられます。&lt;br /&gt;&lt;br /&gt;「\n」は改行を行うことを意味していて、「場所を指定：」の前にあるのは、「場所を指定：」の前に不要な文字が入らないようにするためです。&lt;br /&gt;この一行のみを実行するときは、「\n」があってもなくてもいいのですが、実際に lsp ファイルを作成して自分で作成したコマンドを実行するようになってくると、「\n」がないと前の行の返り値が「場所を指定：」の前に表示されてくるというようなことが起きてくると思います。&lt;br /&gt;&lt;br /&gt;(getint "\n数値を入力：")&lt;br /&gt;コマンド ラインに「数値を入力：」と表示され、入力された整数が返されます。&lt;br /&gt;&lt;br /&gt;(getreal "\n数値を入力：")&lt;br /&gt;コマンド ラインに「数値を入力：」と表示され、入力された値が実数として返されます。&lt;br /&gt;&lt;br /&gt;(getstring "\n文字列を入力：")&lt;br /&gt;コマンド ラインに「文字列を入力：」と表示され、入力した内容が文字列として返されます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-8932028997210775058?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/8932028997210775058/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/01/getpointgetintgetrealgetstring-autocad.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/8932028997210775058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/8932028997210775058'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/01/getpointgetintgetrealgetstring-autocad.html' title='getpoint、getint、getreal、getstring 関数（AutoCAD 2010）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-7128635077648496063</id><published>2010-01-21T12:00:00.001+09:00</published><updated>2011-01-05T21:42:12.686+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoLISP'/><title type='text'>setq 関数（AutoCAD 2010）</title><content type='html'>変数に値を設定する関数です。&lt;br /&gt;&lt;object height="295" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/vw0wsEBwoeU&amp;hl=ja_JP&amp;fs=1&amp;rel=0&amp;color1=0xe1600f&amp;color2=0xfebd01&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/vw0wsEBwoeU&amp;hl=ja_JP&amp;fs=1&amp;rel=0&amp;color1=0xe1600f&amp;color2=0xfebd01&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;b&gt;使用例&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;(setq a 100)&lt;br /&gt;変数 a に整数 100 が割り当てられます。&lt;/blockquote&gt;&lt;blockquote&gt;(setq a 100.0) &lt;br /&gt;変数 a に実数 100.0 が割り当てられます。&lt;/blockquote&gt;&lt;blockquote&gt;(setq a "100") &lt;br /&gt;変数 a に文字列 100 が割り当てられます。&lt;/blockquote&gt;&lt;blockquote&gt;(setq a 100 b 100.0 c "100") &lt;br /&gt;変数 a に整数 100、変数 b に実数 100.0、変数 c に文字列 100 が割り当てられます。&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-7128635077648496063?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/7128635077648496063/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/01/setq-autocad-2010.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/7128635077648496063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/7128635077648496063'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/01/setq-autocad-2010.html' title='setq 関数（AutoCAD 2010）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-7288665906207952110</id><published>2010-01-21T12:00:00.000+09:00</published><updated>2011-01-05T21:42:12.687+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoLISP'/><title type='text'>command 関数（AutoCAD 2010）</title><content type='html'>AutoCAD のコマンドを実行する関数です。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;使用例&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;(command "_.LINE" "0,0" "100,100" "")&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;LINE[線分] コマンドが実行され、0,0 から 100,100 に線分が描かれます。&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;このように、コマンドを実行するときに入力する内容を、"" で囲って順番に入れていけばコマンドを実効できます。&lt;br /&gt;コマンド実行中に Enter を押すような場合は、"" と入力します。&lt;br /&gt;&lt;br /&gt;コマンド名の前に「_.」を入れていますが、通常これを入れるもののようです。&lt;br /&gt;&lt;br /&gt;「_」は英語でのコマンド入力を示しているようです。&lt;br /&gt;例えば、フランス語版の AutoCAD では、STRETCH コマンドは ETIRER コマンドを実行するようになっているようです。つまり、同じコマンドでも、異なる言語版の AutoCAD では、コマンド名が異なることがあるようです。&lt;br /&gt;日本語版は、コマンド名は英語版とすべて同じなので「_」をつけます。&lt;br /&gt;普通みなさんは日本語版の AutoCAD で使用すると思うので、「_」をつけなくても問題なく動作しますが、フランス語などの AutoCAD で「_」をつけないと動かないことがあるのではないかと思います。（フランス語版の環境がないので、確認したことはありませんが。。。）&lt;br /&gt;&lt;br /&gt;「.」は、AutoCAD のオリジナルのコマンドであることを示しています。&lt;br /&gt;AutoCAD では、カスタマイズで元からあるコマンドに新しいコマンドを割り当てることができます。&lt;br /&gt;例えば、UNDEFINE[コマンド定義解除] コマンドで、LINE コマンドを無効にすることができます。その後、自分で新たに LINE コマンドを作成して、独自の LINE コマンドを実行することができるようになります。&lt;br /&gt;そのようなカスタマイズが実行された環境であっても、「.」をコマンドの前につけることで、カスタマイズされたコマンドではなく、AutoCAD が元から持っているコマンドを実行することができます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-7288665906207952110?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/7288665906207952110/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/01/command-autocad-2010.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/7288665906207952110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/7288665906207952110'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2010/01/command-autocad-2010.html' title='command 関数（AutoCAD 2010）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9208187663079327848.post-273079738251570429</id><published>2009-12-25T12:00:00.001+09:00</published><updated>2011-01-05T21:42:12.689+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoLISP'/><title type='text'>AutoLISP（基本）（AutoCAD 2010）</title><content type='html'>AutoLISPを使用してプログラムを作成することにより、新しいコマンドを作成したり、システム変数などの設定を変更したりなどいろいろなカズタマイズを行うことができます。&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;AutoLISP 関数&lt;/b&gt;&lt;br /&gt;AutoLISP は、AutoLISP 関数を実行して、いろいろな動作を実行します。&lt;br /&gt;&lt;div&gt;多くの AutoLISP 関数で、どのようなことを実行できるかを知っておくことは、AutoLISP でプログラムを作成する際に非常に重要となります。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;オンラインヘルプの「AutoLISP リファレンス」の「AutoLISP 関数」において、各 AutoLISP 関数においてどのようなことができるかなどの詳細を確認することができます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;「AutoLISP リファレンス」は以下の手順で確認することができます。&lt;/div&gt;&lt;div&gt;&lt;object height="295" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/BHuGlk6IqtM&amp;hl=ja_JP&amp;fs=1&amp;rel=0&amp;color1=0xe1600f&amp;color2=0xfebd01&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/BHuGlk6IqtM&amp;hl=ja_JP&amp;fs=1&amp;rel=0&amp;color1=0xe1600f&amp;color2=0xfebd01&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;コマンド ラインでの実行&lt;/b&gt;&lt;br /&gt;AutoCAD のコマンド ラインに AutoLISP 関数を入力して実行することができます。&lt;br /&gt;例えば、(alert "テスト") とコマンド ラインに入力すると、以下のダイアログが表示されます。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_-VEZIC7K5VU/S3amA4JSogI/AAAAAAAAAAc/GStJIcwfOuE/s1600-h/img8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/_-VEZIC7K5VU/S3amA4JSogI/AAAAAAAAAAc/GStJIcwfOuE/s200/img8.jpg" width="195" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;LISP ソース ファイル(.lsp ファイル)の作成&lt;/b&gt;&lt;br /&gt;コマンド ラインに AutoLISP 関数を入力して実行することは分かりましたが、何回も繰り返し実行したり、複数行ある AutoLISP を毎回コマンドラインに入力して実行することは現実的ではありません。&lt;br /&gt;そのため、通常は LISP ソース（.lsp ファイル）を作成します。&lt;br /&gt;LISP ソース ファイルは、テキスト ファイルですので、メモ帳など任意のエディタを使用して作成することができます。&lt;br /&gt;LISP ソース ファイルに記述する内容は、コマンド ラインのときと同様に AutoLISP 関数を記述します。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;LISP ソース ファイルの実行方法&lt;/b&gt;&lt;br /&gt;では、LISP ソース ファイルはどのように実行するのでしょう？？？&lt;br /&gt;実行方法はいくつかありますが、以下で手順を確認することができます。&lt;br /&gt;&lt;object height="295" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/L4Mc0Sq5gSQ&amp;hl=ja_JP&amp;fs=1&amp;rel=0&amp;color1=0xe1600f&amp;color2=0xfebd01&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/L4Mc0Sq5gSQ&amp;hl=ja_JP&amp;fs=1&amp;rel=0&amp;color1=0xe1600f&amp;color2=0xfebd01&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;コマンドとして実行する方法&lt;/b&gt;&lt;br /&gt;LISP ソース ファイルの実行方法は分かりましたが、前述の方法で実行するのはちょっと面倒です。&lt;br /&gt;そこで、コマンドとして作成したプログラムを実行することができますので、その方法を紹介します。&lt;br /&gt;その方法とは、defun 関数を使用する方法です。&lt;br /&gt;例えば、以下の内容を記述した LISP ソース ファイルを作成しロードすると、TEST という新しいコマンドを使用できるようになります。&lt;br /&gt;&lt;br /&gt;(defun C:TEST ()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(alert "テスト")&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;以下の手順で、test02.lsp をロードして TEST コマンドが実行できるようになります。&lt;br /&gt;&lt;object height="295" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/e6Ixp0lE7hU&amp;hl=ja_JP&amp;fs=1&amp;rel=0&amp;color1=0xe1600f&amp;color2=0xfebd01&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/e6Ixp0lE7hU&amp;hl=ja_JP&amp;fs=1&amp;rel=0&amp;color1=0xe1600f&amp;color2=0xfebd01&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;すべての図面において defun 関数で定義したコマンドを実行する方法&lt;/b&gt;&lt;br /&gt;前述のように test02.lsp をロードすると、test02.lsp で defun 関数を使用して定義している TEST コマンドが使用できるようになります。&lt;br /&gt;しかし、これは test02.lsp をロードした図面上のみでのことです。&lt;br /&gt;そのため、他の図面において TEST コマンドを実行するときは、再度その図面でロードを行う必要があります。&lt;br /&gt;それって面倒ですよね。&lt;br /&gt;そのために、APPLOAD[アプリケーションロード] コマンドにおいて「スタートアップ登録」という機能があります。&lt;br /&gt;「スタートアップ登録」の設定方法は、以下の通りです。&lt;br /&gt;&lt;object height="295" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/RF3h1CgcZuY&amp;hl=ja_JP&amp;fs=1&amp;rel=0&amp;color1=0xe1600f&amp;color2=0xfebd01&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/RF3h1CgcZuY&amp;hl=ja_JP&amp;fs=1&amp;rel=0&amp;color1=0xe1600f&amp;color2=0xfebd01&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9208187663079327848-273079738251570429?l=acadvideo-programing.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://acadvideo-programing.blogspot.com/feeds/273079738251570429/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://acadvideo-programing.blogspot.com/2009/12/autolispautocad-2010.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/273079738251570429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9208187663079327848/posts/default/273079738251570429'/><link rel='alternate' type='text/html' href='http://acadvideo-programing.blogspot.com/2009/12/autolispautocad-2010.html' title='AutoLISP（基本）（AutoCAD 2010）'/><author><name>管理人</name><uri>http://www.blogger.com/profile/09758811260544866679</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_-VEZIC7K5VU/S3amA4JSogI/AAAAAAAAAAc/GStJIcwfOuE/s72-c/img8.jpg' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
