02.08

Process of Customization using C# |
最新コメント
最新記事
カテゴリ
カウンター
全記事表示リンク
月別アーカイブ
リンク
最新トラックバック
|
2023
02.08 クリアファイル あたった!
2023
01.27 BricsCAD Digital Summit 2023 in JAPAN
昨日、BricsCAD Digital Summit 2023 in JAPAN 閲覧しました。 なかなか、力が入ってたなって感じでした。 ただ、ギャビン、ウォターの2人の前半は、ちょっと、僕には難し過ぎて、 Bricscadって、すごいんだなーってことしか分かりませんでした。 使用されている用語が難しいんですよね。 やはり、後半の杉原さんの説明は分かりやすいです。 また、何だか本多さんと古谷徹さんのトークも 若干、お友達感もあって、おもしろかったですよ。 アンケートも回答しようとスマホ向けたら、画面が消えて、 アンケートに進めませんでした。 なにげに、ショートカットのクリアファイル欲しかったりします。。。 後日、何かの折に、アンケートに進めたら、回答させて頂きます。
2023
01.20 測量座標引出し2
とりあえず、たたき台を作ってみた。 作業手順 1)方位を南から北へ2点クリック 2)既知点をクリック(ここでは、164+0.000とする) 3)既知点のx座標、y座標をそれぞれクリック→座標取得 4)求値点をクリックしていく。(図では、赤がこのプログラムで求値された座標値) 5)ESCで終了。 現状では、164TLの値が何かおかしい。 2つのベクトルのなす角とか、回転方向とか、 なんやら考えてたら、ややこしくなってきて、ちょっと中断。 久しぶりにプログラム書いたら、なんだか全然分からなくて、あせった。 GetSlection ってシングルオブジェクトだけ選択するオプションってなかったかな。 PromptSelectionOptions のキーワードで、SingleOnly = true;ってすればいいのかな。 Filterの中に潜り込ませられないのかな。 using BAA = Bricscad.ApplicationServices.Application; using Teigha.DatabaseServices; using System; using Bricscad.ApplicationServices; using Bricscad.EditorInput; using Teigha.Geometry; using Teigha.Runtime; /// <summary> /// 図面に測量座標を表示するプログラム /// 2023.01.20 /// </summary> namespace 測量座標表示 { public class SokuZa { Point3d _ptOrgBase; double _xBase; double _yBase; Vector3d _vectorHoui; /// <summary> /// 1.方位線の南と北をクリック /// 2.基準点をクリック /// 3.基準点のx座標、y座標文字を取得 /// 4.座標を求めたい点をクリック /// </summary> [CommandMethod("hiraSokuryou")] public void AngleFromXAxis() { var doc = Application.DocumentManager.MdiActiveDocument; var ed = doc.Editor; var db = doc.Database; Point3d? ptSouth = GetPosition("方位線南側を指示:", new Point3d(0, 0, 0), false); if (ptSouth == null) { Application.ShowAlertDialog("方位線南側の取得に失敗しました! 終了します。"); return; } Point3d ptOrgSouth = (Point3d)ptSouth; Point3d? ptNorth = GetPosition("方位線北側を指示:", ptOrgSouth, true); if (ptNorth == null) { Application.ShowAlertDialog("方位線南北側の取得に失敗しました! 終了します。 "); return; } Point3d ptOrgNorth = (Point3d)ptNorth; _vectorHoui = ptOrgSouth.GetVectorTo(ptOrgNorth); Point3d? ptBase = GetPosition("座標を入力する基準点を指示:", ptOrgNorth, false); if (ptBase == null) { Application.ShowAlertDialog("基準点の取得に失敗しました! 終了します。"); return; } _ptOrgBase = (Point3d)ptBase; //文字のみ選択するフィルター SelectionFilter filter = new SelectionFilter(new TypedValue[] { new TypedValue(0, "*TEXT") }); PromptSelectionResult psrx = GetFiterText("基準点X座標文字を選択して下さい。", filter); PromptSelectionResult psry = GetFiterText("基準点Y座標文字を選択して下さい。", filter); string x, y; if (psrx.Status == PromptStatus.OK && psry.Status == PromptStatus.OK) { SelectionSet sSetx = psrx.Value; SelectionSet sSety = psry.Value; using (var tr = db.TransactionManager.StartTransaction()) { try { foreach (SelectedObject sSObj in sSetx) { var ent = tr.GetObject(sSObj.ObjectId, OpenMode.ForRead, false) as Entity; if (ent == null) { continue; } if (ent.GetType() == typeof(MText)) { x = ((MText)ent).Text; } else { x = ((DBText)ent).TextString; } _xBase = double.Parse(x); } foreach (SelectedObject sSObj in sSety) { var ent = tr.GetObject(sSObj.ObjectId, OpenMode.ForRead, false) as Entity; if (ent == null) { continue; } if (ent.GetType() == typeof(MText)) { y = ((MText)ent).Text; } else { y = ((DBText)ent).TextString; } _yBase = double.Parse(y); } } catch (System.Exception ex) { BAA.ShowAlertDialog(ex.Message); return; } } } PromptPointOptions pPtOpts = new PromptPointOptions(""); //キャンセルが押されるまで繰返し処理 PromptPointResult pPtRes = ed.GetPoint(pPtOpts); while (pPtRes.Status != PromptStatus.Cancel) { using (var tr = db.TransactionManager.StartTransaction()) { var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead, false) as BlockTable; var btr = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite, false) as BlockTableRecord; int scale = System.Convert.ToInt32(Application.GetSystemVariable("dimscale")); Point3d? ptZahyou = GetPosition("座標値を求めたい点を指示:", ptOrgNorth, false); if (ptZahyou == null) { Application.ShowAlertDialog("基準点の取得に失敗しました! 終了します。"); return; } Point3d pt = (Point3d)ptZahyou; Point3d ptnew = CreateCoordinate(pt); string stx = String.Format("{0:n3}", ptnew.X); string sty = String.Format("{0:n3}", ptnew.Y); string st = "x= " + stx + " ," + " y= " + sty; ed.WriteMessage(" , " + st); MText mt = new MText() { TextHeight = scale, Contents = st, Location = pt, }; mt.SetDatabaseDefaults(); // Add the MLeader to the drawing: this allows it to be displayed btr.AppendEntity(mt); tr.AddNewlyCreatedDBObject(mt, true); tr.Commit(); } } } /// <summary> /// 測量座標を計算し返す /// </summary> /// <param name="pt"></param> private Point3d CreateCoordinate(Point3d pt) { var doc = Application.DocumentManager.MdiActiveDocument; var ed = doc.Editor; //var db = doc.Database; //座標値はm単位なので1000で割る Vector3d vec = _ptOrgBase.GetVectorTo(pt) / 1000; double len = vec.Length; double rot = GetSita(_vectorHoui, vec); //外積Z成分が正なら反時計回り、負なら時計回り //https://ngroku.com/?p=5086 if (Cross(_vectorHoui, vec).Z > 0)//反時計回り { //方向ベクトルの象限を場合分け //方向ベクトルのxが正でyも正⇒第1象限 if (vec.X >= 0 && vec.Y >= 0)//1象限 { rot = 2 * Math.PI - rot; } else if (vec.X <= 0 && vec.Y >= 0)//2象限 { rot = 2 * Math.PI - rot; } else if (vec.X <= 0 && vec.Y <= 0)//3象限 { rot = 2 * Math.PI - rot; } else if (vec.X >= 0 && vec.Y <= 0)//4象限 { rot = 2 * Math.PI - rot; } } else//時計回り { //方向ベクトルの象限を場合分け //方向ベクトルのxが正でyも正⇒第1象限 if (vec.X >= 0 && vec.Y >= 0)//1象限 { } else if (vec.X <= 0 && vec.Y >= 0)//2象限 { } else if (vec.X <= 0 && vec.Y <= 0)//3象限 { } else if (vec.X >= 0 && vec.Y <= 0)//4象限 { } } double x = len * Math.Cos(rot) + _xBase; double y = len * Math.Sin(rot) + _yBase; double z = _ptOrgBase.Z; Application.ShowAlertDialog("X = " + x.ToString() + Environment.NewLine + "Y = " + y.ToString() + Environment.NewLine + "rot = " + (rot * 180 / Math.PI).ToString() + Environment.NewLine + "vec.x = " + vec.X.ToString() + Environment.NewLine + "vec.y = " + vec.Y.ToString() + Environment.NewLine + "_Cross(_vectorHoui, vec).Z = " + Cross(_vectorHoui, vec).Z.ToString() // //+ Environment.NewLine + "_ptOrgBase.Y = " + _ptOrgBase.Y.ToString() ); ed.WriteMessage("rot = " + String.Format("{0:n3}", rot * 180 / Math.PI)); ed.WriteMessage(" , Cross.Z = = " + String.Format("{0:n3}", Cross(_vectorHoui, vec).Z)); return new Point3d(x, y, z); } /// <summary> /// 2つのベクトルがなす角を求める /// <param name="Vector3d v1"></param> /// <param name="Vector3d v2"></param> /// <returns>なす角</returns> private static double GetSita(Vector3d v1, Vector3d v2) { return Math.Acos(DotProduct(v1, v2) / (v1.Length * v2.Length)); } /// <summary> /// ベクトル内積 /// </summary> /// <param name="Vector3d vecA"></param> /// <param name="Vector3d vecB"></param> /// <returns></returns> private static double DotProduct(Vector3d vecA, Vector3d vecB) { return vecA.X * vecB.X + vecA.Y * vecB.Y + vecA.Z * vecB.Z; } /// <summary> /// 2つのベクトルの外積を計算する /// </summary> /// <param name="Vector3d vecA"></param> /// <param name="Vector3d vecB"></param> /// <returns>Vector3d cross</returns> public static Vector3d Cross(Vector3d vecA, Vector3d vecB) { Vector3d cross; //外積を自前で計算 cross = new Vector3d( vecA.Y * vecB.Z - vecA.Z * vecB.Y, vecA.Z * vecB.X - vecA.X * vecB.Z, vecA.X * vecB.Y - vecA.Y * vecB.X); return cross; } /// <summary> /// /// フィルターを通してテキストを取得するメソッド /// /// /// </summary> /// <returns> PromptSelectionResult psr</returns> /// private static PromptSelectionResult GetFiterText(string myWord, SelectionFilter filter) { Document doc = BAA.DocumentManager.MdiActiveDocument; //Database db = doc.Database; Editor ed = doc.Editor; ed.WriteMessage("\n" + myWord); // フィルターを通して画面のオブジェクトを選択 return ed.GetSelection(filter); } /// <summary> /// /// 位置を取得するメソッド /// /// </summary> /// <param name="moji">文字列を指定</param> /// <returns>ユーザが指定した座標値を返すPoint3d? pt</returns> /// public static Point3d? GetPosition(string moji, Point3d ptStart, bool trueOrfalse) { Document doc = Application.DocumentManager.MdiActiveDocument; Editor ed = doc.Editor; PromptPointResult pPtRes; PromptPointOptions pPtOpts = new PromptPointOptions("") { Message = moji, }; if (trueOrfalse) { //ラバーバンドをオンにする pPtOpts.UseBasePoint = true; pPtOpts.BasePoint = ptStart; } pPtRes = doc.Editor.GetPoint(pPtOpts); Point3d? pt = pPtRes.Value.TransformBy(ed.CurrentUserCoordinateSystem); if (pPtRes.Status == PromptStatus.Cancel) { return null; } else { return pt; } } } static class Extensions { //文字をdoubleへ変換する拡張メソッド internal static double ToDouble(this string st) { return double.Parse(st); } //文字をintへ変換する拡張メソッド internal static int ToInt(this string st) { return int.Parse(st); } } }
|
|
次のページ≫
|
プロフィール
Author:hirahira 検索フォーム
メールフォーム
QRコード
![]() |