建築設計に役立つプログラム集
by chi
★★★-->
e_mail....chi@mocha.ocn.ne.jp
【2009/12/17 C#で3Dプログラム:マテリアル】のシミュレーション。
色だけならカラーダイヤログで充分だが、光具合をみるプログラム。
C#だから、こんなプログラムを簡単に素早く作れる。


【2009/12/17 C#で3Dプログラム:マテリアル】の構造体。
	public struct Smtl //マテリアルの構造体
	{
		public string m_name;
		public double m_kd_r, m_kd_g, m_kd_b;//拡散反射光
		public double m_ks_r, m_ks_g, m_ks_b;//鏡面反射
		//int m_ks_r, m_ks_g, m_ks_b;
		public double m_d;// 1.000000

		public Smtl(string str)  // コンストラクタ
		{ 
			m_name=str;
			m_kd_r=0; m_kd_g=0; m_kd_b=0;
			m_ks_r=0; m_ks_g=0; m_ks_b=0;
			m_d=1.00;
		}

		public Color getColor()
		{
			int r=(int)(m_kd_r*255);
			int g=(int)(m_kd_g*255);
			int b=(int)(m_kd_b*255);
			return Color.FromArgb(r, g, b);
		}
	}
【2009/12/15 C#で3Dプログラム:私に何ができるか】のまとめ。
 □ 3Dのモデルになる「2D」の作図はjwwで行う。
 □ 外部変形でこれらを加工し、3Dデータを作成する。形状はこの段階で確認できるようにする。-> ワイヤーフレーム
 □ 「Pov-RAY・Virod」などのレンダリングソフトが、レンダリングできるよう「専用のファイル」を作成し
   プログラムのシェル機能でファイルを渡し、レンダリングさせる。
 □ まだ、手を付けてないのが「マテリアル」だ。jwwのフォルダ下に、別途リストを下記、用意する構想。
「mList.data」 内容は「obj」と同じものになる
  ・
  ・
 m-1 # インデックス
Kd 0.592157 0.886275 1.000000 # デファーズ:表面の色
Ks 0.150000 0.150000 0.150000 # スぺキューラ:光沢の色
Ns 100.000000 # 光沢の大きさ ・・・?
d 1.000000 # 光沢の計算の限度・・・?
  ・
  ・
  ・
jwwでの、私の外部変形プログラムの「ライフワーク」となる。

【2009/12/13 C#で3Dプログラム:マテリアルの設定:ペイント機能の利用】外部変形で、以下の機能をを、利用して行うつもり。
画像は、古い引き出しから、引っ張り出したもの。「jwf」ファイル設定ツールです。同じようなものは、たくさんありますので
公開は控えていましたが、アレンジして・・・レイヤ色(ペイント機能)の設定プログラムにしようと思います。
ポリゴンの色は作成の基になったレイヤの設定色にするという仕様・・・。


ペイント機能のことだと思うが「バージョン情報」より抜粋

//.............................................................
◆Version 5.01 (2006/06/11)
・印刷時のレイヤ内の図形の塗潰し機能を追加した。

(既定線色の場合)
  レイヤ名に[#cp]に続けて線色番号(1〜8)を記載する。
  SFX線色は(100+線色番号=101〜356)を記載する。
(任意色の場合)
  レイヤ名に[#c]に続けてソリッド図形の任意色の値を記載する。
  (黒「#c0」〜白「#c16777215」)
  レイヤ名に[#c#]に続けて色のRGB値を16進数で記載する。
  (黒「#c#0」〜白「#c#ffffff」)
印刷時の塗潰は、レイヤ内の図形が横方向に分割して出力される。
分割間隔は[#c]で0.05mm、[#C]にすると0.02mmになる。
//.............................................................
【2009/12/12 C#で3Dプログラム:レンダラーvidro】
 を、自前の「jwでのobjモデリング」プログラムに、レンダラーとして取り込みたい。
ファイルフォーマットを調査中。「DXF・DAE・XML」みたいに、冗長な部分は少ないようだ。
jwwでの色(マテリアル)の指定はレイヤ名のソリッドの色の設定を利用しようと想う。
C#(外部変形)でレイヤ名を色番号にするjwf(環境ファイル)編集プログラムを急ぎ作ろう。
他人まかせでなく、貴方も作ってみよう外部変形。


【2009/12/10 C#で3Dプログラム:jwAndShade】

 は、vc++6.0のプログラム[jwDe3D.exe]との連携を考えています。
[jwAndShade]でデータを作成し、[jwDe3D]を呼び出して形状確認、データ保存する。
何故、このような仕様になるのか。DXF保存に必要な3角形分割は[jwDe3D]のみ実現できています。C#に移植する余裕がない。
他人まかせでなく、貴方も作ってみよう外部変形。


【2009/12/10 C#でjww の外部変形:カレンダーの作成:シーン2】

 jwwの座標ファイルって便利ですね。同じユーザだとテキストでデータを提供できる。貴方も作ってみよう外部変形。


#...................2010year_calender_bigen...................................
 0 0 266 0
 0 26 266 26
 0 52 266 52
 0 78 266 78
 0 104 266 104
 0 130 266 130
 0 156 266 156
 0 0 0 156
 38 0 38 156
 76 0 76 156
 114 0 114 156
 152 0 152 156
 190 0 190 156
 228 0 228 156
 266 0 266 156
cn5
cc4
ch 133 169 1000 0 "2010年  1月

ch 19 143 1000 0 "日
ch 57 143 1000 0 "月
ch 95 143 1000 0 "火
ch 133 143 1000 0 "水
ch 171 143 1000 0 "木
ch 209 143 1000 0 "金
ch 247 143 1000 0 "土
ch 195 125 1000 0 "1
ch 233 125 1000 0 "2
ch 5 99 1000 0 "3
ch 43 99 1000 0 "4
ch 81 99 1000 0 "5
ch 119 99 1000 0 "6
ch 157 99 1000 0 "7
ch 195 99 1000 0 "8
ch 233 99 1000 0 "9
ch 5 73 1000 0 "10
ch 43 73 1000 0 "11
ch 81 73 1000 0 "12
ch 119 73 1000 0 "13
ch 157 73 1000 0 "14
ch 195 73 1000 0 "15
ch 233 73 1000 0 "16
ch 5 47 1000 0 "17
ch 43 47 1000 0 "18
ch 81 47 1000 0 "19
ch 119 47 1000 0 "20
ch 157 47 1000 0 "21
ch 195 47 1000 0 "22
ch 233 47 1000 0 "23
ch 5 21 1000 0 "24
ch 43 21 1000 0 "25
ch 81 21 1000 0 "26
ch 119 21 1000 0 "27
ch 157 21 1000 0 "28
ch 195 21 1000 0 "29
ch 233 21 1000 0 "30
#...................2010year_calender_end...................................
【2009/12/09 C#でjww の外部変形:カレンダーの作成】

「こんな外部変形ありませんか、フリーで」・・・も良いが、他人まかせでなく、貴方も作ってみよう外部変形。

        private void button1_Click(object sender, EventArgs e)
        {
            // 枠を描く
            int w = 38; int h = 25; int n = 7;
            for(int i=0; i < n; i++)
            {
                int sx=0; int ex=266;
                int sy=i*h; int ey=sy;
                m_jwstr=m_jwstr+ string.Format(" {0} {1} {2} {3}\n", sx, sy, ex, ey);
            
            }
            for (int i = 0; i < 8; i++)
            {
                int sx = i*w; int ex = sx;
                int sy = 0; int ey = 150;
                m_jwstr = m_jwstr + string.Format(" {0} {1} {2} {3}\n", sx, sy, ex, ey);

            }
            // 文字を描く
            string str = comboBox1.Text + "  " + comboBox2.Text;// MessageBox.Show(str);
            m_jwstr=m_jwstr + "cn5\ncc4\n";
            m_jwstr = m_jwstr + string.Format("ch 133 162 1000 0 \"{0}\n", str);
            for (int i = 0; i < n; i++)
            {
                int ofx = 19; int ofy = 137;
                m_jwstr = m_jwstr + string.Format("ch {0} {1} 1000 0 \"{2}\n", ofx + i * w, ofy, m_youbi[i]);
            }
            saveFile("ztemp.txt", m_jwstr); MessageBox.Show("make_ok");
        }
【2009/12/09 C#で3Dプログラム・・・obj_multi_view ・・・印刷機能】

 を付けたい。本格的な「CGツール」として、紙に印刷して活用するみたいなぁこと。
「A3の裏が白紙の紙がたくさん余っている」捨てるのが勿体無い。「エコ」だから活用しなくちゃ。
印刷機能を実現するためには、1枚の紙としてFormにDrawしなくてはならない。PictBoxだと自動的にクリッピング
してくれるが・・・。jwwの座標ファイルで出力し印刷が早いかも。どちらしても、いちから、やり直しだな。
まず、来年の「カレンダー」印刷プログラムしてみよう。

【2009/12/09 C#で3Dプログラム・・・obj_multi_view 】

 やっと、マルチ表示成功。結局、ひとつ、ひとつ、それぞれの「PictBox」に対し手作業でコードを書いてしまった。
垂直方向の表示位置がおかしい。次は「minmax」のルーチンの詳細に見直し。


【2009/12/07 C#で3Dプログラム・・・obj_multi_view 】

 やっと、3つまで表示成功。結局、ひとつ、ひとつ、それぞれの「PictBox」に対し手作業でコードを書いてしまった。
やれやれ。あと、13個のハードルが・・・ひとおり、済ましたら、配列で省力化しよう。
あれ、まだ、垂直方向の表示位置がおかしい。「minmax」のルーチンの詳細に見直しが必要のようだ。


【2009/12/07 C#で3Dプログラム・・・Kerkytherでobj 】

 「やぎPさん」作・・・6Box.objを読み込んでみました。古い話ですが、データ提供ありがとうございました。
マテリアルは反映するようです。マテリアルの別途記述がobjの「いやみ」なところです。
Kerkytherで標準の「XML」でマテリアルを埋め込めるか模索してみます。
参考書が少なく「英語」の世界だから、理解には
時間が掛かりそう。まずは「XML」の解析から。C#は「XML」得意みたいで。やってみます。
テキスト記述は「Pov-RAy」で充分だが。


【2009/12/05 C#で3Dデータ回転の計算 】

 下図の画像はobjデータを作成して、確認のためデータを回転させて表示したもの。


 まず、ポリゴン頂点を回転させます。頂点の回転はマトリックス演算で行います。
たくさんの頂点がある場合や表示スピードなどを考慮して関数の計算では、参照渡しで計算します。
参照渡しという概念は非常に大切なので「Basic]のひとは充分理解してください。
        public double m_rx = 30; //X軸回転
        public double m_ry = 0; //Y軸回転
        public double m_rz = 0; //Z軸回転
        public double m_dspK = 1.0; //表示倍率
        public double m_dk;       //表示係数
        public int m_job;       //表示モード
        public double[,] m_mat; //アフィン変換用マトリックス

        public Cobj m_obj0;     //objのクラス
        public string m_fname0; //ファイルネーム
上記は「クラス」のメンバー変数の設定です。関数では。
       public void obj_rotate(string fname, double m_rx, double m_ry, double m_rz)
        {
            List x = new List();
            List y = new List();
				・
				・
				・
				・
            if(rx != 0)
            {
                g_func.setRotMt_x(m_rx, mat); // X 軸のアフィン変換用マトリックス(mat)セットする
                g_func.trans3(po, xn, mat); // 頂点の配列とマトリックスのセットを関数に渡し計算する
				
				// g_func は独自のライブラリー
            }
		}
C#の場合「配列」はC++と同じで参照渡し(メモリー上の変数を直接書き換える)になるので、
結果の出し入れの必要が無い。ここが利点。
早足で、この辺で・・・。行列の計算(理解)は「3Dプログラム」の必項で
CG関係の本(IT)には必ず解説しているはずで、そちらにゆずります。

【2009/12/05 3Dデータのパースの計算 】
 参考にならないと想いますが私の「jwDe3D.exe」の3Dデータの表示のときの パースの計算 のコードです。VC++6.0でのものです。 視点よりスクリーンの位置はオブジェクトのx、y、zの最大値の半分に離しています。これは、経験値です。
// 全てのポリゴンデーターをDSPに表示
void Cpoly::dspAllData(CDC* pDC) {
 	int begin, end, sx, sy, x, y, i, j;

 	CPen pen, *oldPen;
	pen.CreatePen(PS_SOLID, 1, RGB(255, 255, 0));
	oldPen=pDC->SelectObject(&pen);
   	for(i=0; i < m_polyN; i++) {
        begin=pPoly[i].head; end=begin+pPoly[i].pn;
        sx=(int)(m_dspCx+(p2Point[begin].x-m_zuCx)*m_dspK); // パースの計算
        sy=(int)(m_dspCy-(p2Point[begin].z-m_zuCz)*m_dspK); // パースの計算
        pDC->MoveTo(sx,sy);
        for(j=begin+1; j < end; j++) {
        	x=(int)(m_dspCx+(p2Point[j].x-m_zuCx)*m_dspK); // パースの計算
        	y=(int)(m_dspCy-(p2Point[j].z-m_zuCz)*m_dspK); // パースの計算
        	pDC->LineTo(x, y);
        }
        pDC->LineTo(sx, sy);
    }
}
【2009/12/04 C#で objファイルのマルチビューア 】
 を作っています。 私は、3Dデータの標準ファイルフォーマットは「obj」だと思っています。
データ形式が合理的で、プログラム的に扱いやすい。「DXF」はくせがあり、よくいう解釈の問題が・・・。
データ形式は私の3Dプログラムと「ピッタリ」合う。 それで、「obj」をテーマに掘り下げて、プログラムに取り組んでいます。
マルチビューア は一度に16個表示するため、表示するオブジェクトの大きさのバラバラが予想されるため
pictBoxの画面にオブジェクトの大きさを合わせるのに苦労します。
表示するデザインパターンは確立してますので16個分、力まかせにコードを書くのもよいが、美しくない。大変だ
グットアイデアを模索しています。出来たら、公開します。
一応、まとめて、ファイル名の取得までできています。


【2009/12/04 今年の「サンタ」さんはどうした 】
 ネットでダブルスタンダードの「ID」を使って発言をする人がいる。メールまでも
  (・・・メールはプログラムで「IPアドレス」を確認できます)

いじめやまずい発言をするとき「ID」を変えるようだ。人間として恥ずかしいひとだ・・・?
発言の内容の「コンテキスト」から誰か!が解る。頭隠して、尻、隠さずだ
C#で「さんた・いじめ星人」を描いてみよう。期待あれ(笑)

【2009/11/30 C#で obj編集プログラム-> objEdit.exe 】
 objファイルのマージ・スケール・回転・移動などの編集を行う、プログラムを作っています。
あれ、表示を少し下げないと、いけませんね。


【2009/11/29 C#で3Dプログラム ->コマンド getSphere】
 jwwの円データを外部変形で読込、「球」のオブジェクトを作成します。
ここに示した円柱などの各オブジェクトはクラス「Cdisk」に部品化しています。
一度、プログラムを部品化するとコードは下記のように簡単になります。プログラムの「メンテ」も簡単になります。
変数がひとつのブロックで完結すること(ローカル変数)が大切です。
         private void radioButton8_CheckedChanged(object sender, EventArgs e) // getSphere
        {
            Cdisk disk = new Cdisk(1000, 12, 1000);
            string str = disk.getSphere(1000);
            saveFile("sphere.obj", str); MessageBox.Show("ok_sphere");
        }




【2009/11/28 このページの趣旨】
 私は「ただのひとし」じゃなくてだだの「建築設計屋(意匠担当)」です。
プログラムは「素人」です。「外部変形」(プログラム)という分野を知り、
使い方により、つらい設計作業を大幅に楽できることを知りました。
 このページは私の「外部変形」の提供ではなくて、「外部変形でこんなことができるぞ」という
紹介のつもりで書いています。
ソースコードを載せるのは、あなたも「外部変形」に挑戦してみれば
努力次第で「楽できるぞ」という気持ちです。だから、コードは参考程度にしてください。
 私の「外部変形」をパクって自分のページに断りも無く、勝手に自分の「コンテンツ」にするのは困る。
善意の紹介のつもり、かもしれないが「パクリに善意の紹介」はありえない
必ず、パクリ先の了解が必要だと想う。
 昔、「設計屋はちょっとした、プログラムぐらい組めなくては・・・chiさん教えて」
と頼まれたことがある。当時「タイプ」じゃないから断ったが、
これに答えて「下手の横好き」だが参考になりそうなコードは掲載してゆきたいです。
同じ設計屋さんに対し「世のため、人のため・・・ぐぁんばります」で・・・・。

【2009/11/28 C#で3Dプログラム ->コマンドwLine2Cylinder】
 jwwの2本の線データを外部変形で読込、「円柱」のオブジェクトを作成します。
カーブラインに沿って円柱を結び、「ロープ状」のオブジェクトを作るのが最終目的です。



【2009/11/26 C#で3Dプログラム ->コマンドjwLine2Box】
 jwwの線データを外部変形で読込、「棒状」のオブジェクトを作成します。
建築のアイテムは面ばかりではありません。テントのテンションを掛けるロープみたいな線状の形状が必要では
と感じ、作っています。済み次第、円形カーテンウォールを少ないパラメータで自動的にモデリングできるよう
始めます。まずは、マリオン(方立)のデザインから。
ハートマークでくりぬいたH鋼のラチスから試しに作ってみよう。


【2009/11/24 C#で3Dプログラム その4】
 遅れましたが、ここのソースコードは C#2500(フリー)でのものです。
画像はC#の「線にグラデ」を試したものです(グラデーションを付ることができる)。
jwwではソリッドを使うことで同等なグラデが可能です。
線を太く、ドラマチックな色の変化で、面白い表現ができるかも・・・と想っています。


【2009/11/24 C#で3Dプログラム その3】
 前回の「ギザギザスカートの子守唄・・・♪-scene_2」です。
画像の後に、このモデルのC#のプログラムのソースを掲載しました。

 私が公開するソースコードは参考程度にしてください。パクリは遠慮ください。
NETでのパクリを得意とする人は「信用できない」・・・
「パクられるのは公開するほうが悪い」・・・そんな人がいますから「外部変形」の公開を控えています。(笑)


【2009/11/22 ギザギザスカートの子守唄・・・♪-scene_2】です。
腰部のX,Y座標値に縮小を掛けてみました(*0.5)。


【2009/11/22 ギザギザスカートの子守歌・・・♪】です(笑)。
今回は、時間がなくて、腰部を絞るのを「パス」しました。
x,y座標値に縮小を掛けると絞れるのですが次回はやっておきます。そして、ソースの公開も。


【2009/11/21 C#で3Dプログラム シーン2】
 まずは、サインカーブから描いてみましょう。カーテンとしての表現は
ベジェ曲線よりサイン曲線のほうが式が簡単で、頂点の数・振幅やリピート回数が設定しやすいということで。



【2009/11/20 C#で3Dプログラム】
HPのスペースに、余裕ができたので上記「テーマ」を始めます。
「Shade」と「jww」との連携をにらんで、まずは、プログラムの部品を作ろう。
C#は「構造体」、「クラス」両方使えます。私の使い分けは
簡単なデータ構造でメソッドを含まない時は「構造体」で
メソッドを含む複雑な内容のときは「クラス」とします。
「クラス」は使うとき必ず「new」(インスタンス)すること。「構造体」は省略できると
記憶しています。この辺は怪しいので下記コードでテストしてみます。
今回はベジェ曲線を描く準備。

using jwGaihen;
using polygon;
using func;
using System.Collections.Generic;

namespace cg_item
{
   public struct SvzPoint // ベジェポイント構造体
   {
    	public S3dpoint pt;
    	public S3dpoint in_pt;
     	public S3dpoint out_pt;

       public SvzPoint() // 何もしないコンストラクタ
       {
       }
       
       public void SvzPoint(S3dpoint pt, S3dpoint in_pt, S3dpoint out_pt) // コンストラクタ
       {
		this.pt=pt;
		this.in_pt=in_pt;
		this.out_pt=out_pt;
       }
       
       public void setData(S3dpoint pt, S3dpoint in_pt, S3dpoint out_pt)
       {
		this.pt=pt;
		this.in_pt=in_pt;
		this.out_pt=out_pt;
       }

       public class CpointSet // 頂点の並びのクラス、ある意味ではPathLine
       {
       		public void CpointSet() // コンストラクタ
	   		{


       		}
}
//....................................................
【2009/11/20 久し振りに「Shade」で遊んでみた】
カーテンのつもり。規則正しいからそれらしくないですね。
一応「ドレープ」のつもり。だが、らしく見えるように、少し乱数を入れてみよう。


【2009/11/19 C#のプログラムでベジェ曲線を作る】
「Shade」のスクリプトで使うには頂点をはっきり、させねばと。
画像の後に、作成したソースコードを掲載。


        private void button4_Click(object sender, EventArgs e)
        {
            Spoint2 pt0 = new Spoint2(0, 0);
            Spoint2 pt1 = new Spoint2(0, 100);
            Spoint2 pt2 = new Spoint2(200, 100);
            Spoint2 pt3 = new Spoint2(200, 0);
           
            CvzLine vz = new CvzLine(pt0, pt1, pt2, pt3); // 自作のベジェ曲線クラス CvzLineのインスタンス
            List pts = vz.getData(10); // データの取り出し
            sp2saveFilejwLine("ztemp.txt", pts);
        }
【2009/11/18 下記画像のスカートのひらひらはベジェ曲線】
 で描きました、この曲線のオブジェクトに高さを与えて 「Shade」の自由曲面面にスローすれば自動的に頂点を結んでくれて プログラムで結ばなくてもカーテンの出来上がり。
この辺が「Shade」の自由曲面面の素晴らしさだと想います。 SUでは自動的にできない。そろそろ、「Shade」に回帰しようかな。スクリプトが「python」なので 躊躇する。まだ「VR9.0」だし。

【2009/11/17 スカートがひらひら】
 で、カーテンのモデリングです。
今日から、ページのメンテをはじめます。


【2009/11/16 おかっぱ頭の髪の毛】
 です。「たまねぎの皮」のモデリングをアレンジして作りました。
髪の毛のひと房です。顔のまわり(半円)に配置して「おかっぱ頭」作る。
人物のCGは目的でないが、そのうち、建築CGに応用できるかも。
とにかく、何でも試してみよう。という、精神です。


【2009/11/15 たまねぎの皮計画】
 です。曲面の最後のモデリングのテーマとして。
なぜ、「たまねぎ」というと
「たまねぎの味噌汁を作ろうと、たまねぎを買ってきた」が皮のむきかたが解らない。
おのれ、モデリングしちゃうぞ・・・っという具合。


【2009/11/14 ウィルス星人】
「ごほん、ごほん・・・」ひととおり、C#の持つ「GDI++」を試したので、
そろそろ、大台(240,000人)超えたあたりで、ページを閉じようと想う。
imgをたくさん、載っけ、したので整理しないとパンクが心配だ。