仕事のカタマリにようこそ!  [ ログイン | ユーザ登録 ]
フォーラムから検索

機械用3D-CAD SolidWorks非公認のユーザサイトです
 
 
Web katamari.org
仕事のカタマリ
ホーム リンク集 ダウンロード フォーラム(掲示板) FAQ お問い合わせ









フォーラムニュース: 質問、相談カテゴリに「SolidWorks操作方法」に関するフォーラムを追加しました。(2003/11/27)
いらっしゃい、 ゲストさん. まずはこちら→ ログイン または 登録. 2024/11/23 - 02:49:14
ホーム ヘルプ 検索 ログイン 登録

仕事のカタマリ 掲示板  |  SolidWorks一般  |  SolidWorksのカスタマイズ (議長: webmaster)  |  トピック: class Form1の値をclass SolidWorksMacroで利用したい 前のトピック 次のトピック
ページ: [1] Page Bottom 返信 返信のお知らせ Print 
   著者  トピック: class Form1の値をclass SolidWorksMacroで利用したい  (閲覧数 2788 回)
bybalsendercase
Full メンバー
***

オフライン

投稿: 27



I'm a llama!

プロファイルを見る
class Form1の値をclass SolidWorksMacroで利用したい
« 投稿日: 2015/08/23 - 16:55:56 »
引用して返信

ご多忙中申し訳ありません。


class Form1の値をclass SolidWorksMacroのMessageBoxで表示したいのですが、現状のコードのままですとclass Form1のコードが素通りして値が取得できません。
なんかあまりにも初歩的な質問で恐縮ですが、教えてください。

public partial class SolidWorksMacro
    {       
        public SldWorks swApp;
          public void Main()
        {
            Form1 f1 = new Form1();           
            f1.Show();         
            MessageBox.Show(f1.num.ToString());         
            }
          }


public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }             
        double _num;
        private void button1_Click(object sender, EventArgs e)
        {         
          _num = 0.1;         
                            }
        public double num
        {
            get { return _num; }
        }


フォームにボタンを貼り付けてボタンをクリックしたらメッセージボックスに0.1が表示されるようにしたいと思います。


どうかよろしくお願いします。
議長に報告する   記録済み
hisa
カタマリの王様!?
*****

オフライン

投稿: 507



PANDA-Z!!

プロファイルを見る WWW
Re:class Form1の値をclass SolidWorksMacroで利用したい
« 返信 #1 投稿日: 2015/08/25 - 13:04:39 »
引用して返信

bybalsendercaseさん、こんにちは

一番手っ取り早い方法は、フォームをShow→ShowDialogに変えて表示してあげることで、フォームが閉じられるまで処理待ちさせることが可能です。
ShowDialogを使うと、フォームが閉じられた状況も返すことが可能なので便利です。
ただし、フォーム表示中にSolidWorks側で操作が必要な場合は、ShowDialogは適さないので、Showで表示させる必要があります。
その場合は、「.net フォーム 値 保持」などで検索すると、いろいろ方法が調べられると思います
議長に報告する   記録済み
bybalsendercase
Full メンバー
***

オフライン

投稿: 27



I'm a llama!

プロファイルを見る
Re:class Form1の値をclass SolidWorksMacroで利用したい
« 返信 #2 投稿日: 2015/08/25 - 18:01:14 »
引用して返信

hisaさんへ

お返事ありがとうございます。


>フォーム表示中にSolidWorks側で操作が必要な場合は
まさに上記の通りです。


>「.net フォーム 値 保持」
こちらで検索してみます。
議長に報告する   記録済み
bybalsendercase
Full メンバー
***

オフライン

投稿: 27



I'm a llama!

プロファイルを見る
Re:class Form1の値をclass SolidWorksMacroで利用したい
« 返信 #3 投稿日: 2015/08/28 - 20:35:56 »
引用して返信

hisaさんへ


こんばんは


ご多忙中大変申し訳ありません。

「.net フォーム 値 保持」で検索すれば簡単にできるとおもいきや
マクロでは簡単にはいかないみたいです。



以下はMicrosoft Visual Studio 2012で書いたコードです。
#Form1にはボタンを2個貼り付けています。
#1個はForm2の表示のためです。
#もう一つはclass Form2から値を取りに行くためです。
#class Form2はボタンが1個、テキストボックスが1個貼り付けてあります。


// class Form2の作成
        Form2 f2 = new Form2();
        //string _str;
        private void button1_Click(object sender, EventArgs e)
        {
            //Form2の表示
            f2.Show();           
        }
                private void button2_Click(object sender, EventArgs e)
        {
            //class Form2から値を取りに行く
            textBox1.Text = f2.str;
        }



//class Form1に渡す値の変数
        static string _str;     
        private void button1_Click(object sender, EventArgs e)
        {
            _str = textBox1.Text;         
        }
        //textBox1の値をプロパティに読み取る
        public string str
        {
            get { return _str; }           
        }
    }



こんな感じでForm1もForm2も消さないで値の受け渡しをしています。これと同じようにマクロでもForm1も消さないでclass SolidWorksMacroに値を渡したいと思います。


たぶんすご?く簡単なことかもしれませんが、しばらくプログラミングから遠ざかっていたため、よくわからなくなりました。


大変申し訳ありません、なにかヒントでもいいですのでご教示お願いします。
よろしくお願いします。


議長に報告する   記録済み
hisa
カタマリの王様!?
*****

オフライン

投稿: 507



PANDA-Z!!

プロファイルを見る WWW
Re:class Form1の値をclass SolidWorksMacroで利用したい
« 返信 #4 投稿日: 2015/09/18 - 11:38:47 »
引用して返信

bybalsendercaseさん、こんにちは

あれから調べてみたのですが、まずForm1を表示してもMainの処理が終了してForm1が閉じてしまう件に関しては、実際にビルドしたものを実行する際には閉じない様です。
Debug中は、すべての処理が完了するとDebug完了と共にForm1も閉じてしまいます。
回避方法は、SolidWorksのシステムオプションにある「VSTAデバッグをマクロ終了時に停止」のチェックを外すだけで良いです

Form1表示中に、SolidWorksMacroで継続して処理させたい場合ですが、ちょっと工夫が必要見たいです
この方法が最良かは分かりませんが、BackgrouodWorkerを使ってForm1が閉じるまで待機する処理を実行させれば良さそうです
(多分…)
単純にForm1が閉じるまで繰り返すループ処理をMainに入れると、SolidWorks自体が操作できなくなるため、BackgrouodWorkerを使って後ろで待機させます。

コードは、こんな感じです。
bw.RunWorkerAsync()でbw_DoWorkが実行され、bw_DoWork内の処理が終わったらbw_RunWorkerCompletedが実行される感じです。

Code:
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;
using System.Runtime.InteropServices;
using System;
using System.Windows.Forms;
using System.ComponentModel;


namespace Macro1.csproj
{
    public partial class SolidWorksMacro
    {
        Form1 frm1 = new Form1();
        static BackgroundWorker bw;

        public void Main()
        {
            //Form1表示
            frm1.Show();

            //バックグランドワーカー生成
            bw = new BackgroundWorker();
            //イベント登録
            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
            // バックグランドワーカー開始
            bw.RunWorkerAsync();

            // Form1表示後にすぐ処理されてしまう…
            MessageBox.Show("まだ終わってない!");
        }

        /// <summary>
        ///  The SldWorks swApp variable is pre-assigned for you.
        /// </summary>
        public SldWorks swApp;

        void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker bw = sender as BackgroundWorker;

            //Form1が閉じる(非表示)になるまでループ開始
            while (frm1.Visible == true)
            {
                // 1秒待機
                System.Threading.Thread.Sleep(1000);
            }
        }

        void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("フォーム閉じた!");
        }
    }
}


どのタイミングでSolidWorksMacro側に処理をさせるかが分からないので、とりあえずこんな感じで…
Form1をメインフォームとしてSolidWorksMacro側で実行させようとしている処理をさせても良い気はしますが
議長に報告する   記録済み
bybalsendercase
Full メンバー
***

オフライン

投稿: 27



I'm a llama!

プロファイルを見る
Re:class Form1の値をclass SolidWorksMacroで利用したい
« 返信 #5 投稿日: 2015/09/19 - 04:54:49 »
引用して返信

hisaさんへ


こんにちは


>「VSTAデバッグをマクロ終了時に停止」のチェックを外すだけで良いです


>BackgrouodWorkerを使ってForm1
>が閉じるまで待機する処理を実行させれば良さそうです


上記の2通りのパターンは非常に有効です。
BackgrouodWorkerは依然はよく使っていましたが、最近はプログラムから離れていましたので完全に忘れていました。


BackgrouodWorkerは少し癖がありますので、サンプルのコードを書いていただいたので助かりました。



貴重な情報を有難うございました。


議長に報告する   記録済み
bybalsendercase
Full メンバー
***

オフライン

投稿: 27



I'm a llama!

プロファイルを見る
Re:class Form1の値をclass SolidWorksMacroで利用したい
« 返信 #6 投稿日: 2015/09/19 - 04:55:43 »
引用して返信

hisaさんへ


こんにちは


>「VSTAデバッグをマクロ終了時に停止」のチェックを外すだけで良いです


>BackgrouodWorkerを使ってForm1
>が閉じるまで待機する処理を実行させれば良さそうです


上記の2通りのパターンは非常に有効です。
BackgrouodWorkerは依然はよく使っていましたが、最近はプログラムから離れていましたので完全に忘れていました。


BackgrouodWorkerは少し癖がありますので、サンプルのコードを書いていただいたので助かりました。



貴重な情報を有難うございました。


議長に報告する   記録済み
ページ: [1] Page Top 返信 返信のお知らせ Print 
仕事のカタマリ 掲示板  |  SolidWorks一般  |  SolidWorksのカスタマイズ (議長: webmaster)  |  トピック: class Form1の値をclass SolidWorksMacroで利用したい 前のトピック 次のトピック
ジャンプします: