2022
06.28
06.28
画層スライドショウ2
プログラム的につまづいたのは、transactionの処理。
59行目 ltr = tr.GetObject(oid, OpenMode.ForWrite, false) as LayerTableRecord;
のところで何度もエラーになる。。うーん、動くはずなんだけどなぁ。。
そしてこの記事みてて、思い当たった。
tr.commit()したあと、また、tr使ってるから、エラーになってる?ってこと?
このプログラムの特異なところは、foreachで何度もtransactionを実行していること。
ひとつひとつ画層表示を繰り返して、指定の時間待って、
また、次の画層表示を実施する。
このため、普通のプログラムなら、tr.commit()は1回だけなんだけど、
このスライドショウの場合、tr.commit()がforeachの中に入らなきゃならない。
それで以下のように、トランザクションをネストさせるように修正したら、無事、動作した。
だが、このプログラムでは、終了が上手くできない(汗)。
using System.Collections.Generic; using System.Linq; using System.Windows.Threading; using Teigha.DatabaseServices; using BAA = Bricscad.ApplicationServices.Application; using System.Windows; using System.Windows.Controls; /// <summary> /// 画層スライドショウ /// </summary> namespace LayerSlideShow { /// <summary> /// UserControl1.xaml の相互作用ロジック /// </summary> public partial class UserControl1 : UserControl { public UserControl1() { InitializeComponent(); } private void SlideGo(int val) { Database db = BAA.DocumentManager.MdiActiveDocument.Database; //トランザクション1開始 using (var tr = db.TransactionManager.StartTransaction()) { if (val == 0) return; var lt = tr.GetObject(db.LayerTableId, OpenMode.ForWrite) as LayerTable; int num = 0; //ltに含まれる画層名をstringで取り出し List<string> listLayer = lt.Cast<ObjectId>() .Select(oid => { return ((LayerTableRecord)tr.GetObject(oid, OpenMode.ForRead, false)).Name; }).ToList(); LayerTableRecord ltr; foreach (var layer in listLayer) { LabelGasoName.Content = num.ToString() + " : " + listLayer[num]; DoEvents();//LabelGasoName.Contentの更新 //トランザクション2開始 using (var tr2 = db.TransactionManager.StartTransaction()) { foreach (ObjectId oid in lt) { ltr = tr2.GetObject(oid, OpenMode.ForWrite, false) as LayerTableRecord; if (ltr.Name == listLayer[num]) { ltr.IsOff = false;//画層表示 } else { ltr.IsOff = true;//画層非表示 } } num++; ReDraw(); tr2.Commit(); int speed = 500 * val; //1秒間(1000ミリ秒)停止する System.Threading.Thread.Sleep(speed); } } } } /// <summary> /// 現在メッセージ待ち行列の中にある全てのUIメッセージを処理します /// https://gist.github.com/pinzolo/2814091。 /// </summary> private void DoEvents() { DispatcherFrame frame = new DispatcherFrame(); var callback = new DispatcherOperationCallback(obj => { ((DispatcherFrame)obj).Continue = false; return null; }); Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, callback, frame); Dispatcher.PushFrame(frame); } private void ReDraw() { //' Redraw the drawing BAA.UpdateScreen(); BAA.DocumentManager.MdiActiveDocument.Editor.UpdateScreen(); //' Regenerate the drawing BAA.DocumentManager.MdiActiveDocument.Editor.Regen(); } private void ButtonEnd_Click(object sender, RoutedEventArgs e) { SlideGo(0); } /// <summary> /// 標準速 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ButtonGo_Click(object sender, RoutedEventArgs e) { SlideGo(2); } /// <summary> /// 緩速 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ButtonSlow_Click(object sender, RoutedEventArgs e) { SlideGo(3); } /// <summary> /// 急速 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ButtonFast_Click(object sender, RoutedEventArgs e) { SlideGo(1); } } }
コンパイル環境 Visual studio 2022 Current V17.1.1 + BricsCAD V22.1.04(x64)
- 関連記事
スポンサーサイト