AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
データベース【CADデータベースな話(5)】
CADソフトウェアは、線分や円・円弧、文字、寸法線などで図面の作図・編集を行い、画面に表示・プリンタで印刷・図面データの保存・呼出などを行います。それら線分・円・円弧・文字・寸法線等のデータは、メモリ等に格納し様々な活用を行います。Delphiの場合は、動的メモリ・動的配列・ストリーム・ファイルなどが利用出来ますが速度優先のため動的メモリ・動的配列を利用するのがほとんどと思われます。そのため、そのプログラムそのものだけがデータを作成・編集・運用を行う事が出来ます。複数のプログラム/複数のPCから共通のデータ領域を相互利用する事は一般的に出来ません。
 
昨今、LAN・WAN・インターネット上のアプリケーションが多く出てきていますが、CADソフトでもそういったものが少しづつ出てきているようです。複数のPCで1つの図面データを同時に開き、同時に編集し、コミュニケーションを取りつつ様々な協議等を行ったりグループ作業を行ったりするようです。そういった場合には、PC内の動的メモリを利用する手法では出来ません(仮に、逐次ファイル化する等をしても必ずタイムラグ等が発生しリアルタイムな共有化は出来ません)。ファイル化して共有モードで開き編集するという手法もありますが、ファイル単位ではなく1データ単位での排他処理が可能かどうか、排他処理を行う場合の安全性・信頼性は?等々、幾分不安な面はあります。そういう場合に、既に確立されているC/S型データベースを利用するとどうであろうか?という事について少し考えてみたいと思います。
 
勿論、メモリではなくデータベースを利用する事によってデータのアクセス速度は遅くなるでしょうから、自然と、画面描画や検索速度等は遅くなるであろうと予測は、実際に作るまでもなく、分かると思います。あくでもグループ作業という運用性のメリットがあるというだけの為のお話です。
 

 
CADの前にまず単純なお絵描きソフトについて考えてみます。
お絵描きソフトは、ペン先の形状、色を指定しておき、画面(キャンバス)にマウスをなぞる事によって絵を描きます。作成するデータはその画面そのもの、そのキャンバス状態をそのままBMPファイル化したドット情報となります。簡単なサンプルを作ってみます。

ソース及び実行プログラムを圧縮しています
 
320×240・24bit色の場合、そのBMP形式ファイルのファイルサイズは301KBになります。ドット数が増えると絵の内容に関わらずファイルサイズも大きくなります。これをデータベースに入れるとなるとBLOB型で扱う事になると思われます。他とのデータ共有化を図る為にはどこかのタイミングでデータベースに登録・呼出を行う必要があります。仮に、マウスを放した時に登録を行うとしても、どのタイミングで呼出をするのか、一定時間毎にデータ更新をするとしても、マウスで作図している最中に他から別の作図が行われる可能性もある訳で、仮に1秒単位で更新するとしても、その1秒間で301KBのデータを呼び出し、画面全体の描き直しが行われ、マウスでの作図に戻り、また1秒後に・・・をずっと連続で行われる事になってしまいます。画面全体の描き直しは、画面の「ちらつき状態」に繋がります。見えにくく目に良くないですし、普通に使うだけの速度が得られるのかはかなり疑問です。
 
という訳で、ドット絵(ラスターイメージ)の「お絵描きソフト」であるとしてもデータベースアプリケーションにする場合には、イメージデータそのものを扱うのではなく、コマンド単位でのデータ登録&呼び出しを行うのが良いと思われます。
 

 
さて、データベースです。
これまで同様、データベース名を決める必要があります。Windowsに標準添付されているお絵描きソフトは「ペイント」という名前ですので、それに似せて、データベース名は「PAINT.FDB」とします。前回のものを利用出来る部分は利用する事にしましょう。
 
テーブル「SECTION」(TABLE1)
名前変数名内容
登録番号N整数 1,2,3,… 他と重複しない
名称SNAME文字(最大半角32文字)
 
テーブル「MEMBER」(TABLE2)
名前変数名内容
登録番号N整数 1,2,3,… 他と重複しない
所属SN整数 「SECTION」の登録番号
氏名PNAME文字(最大半角16文字)
 
プロジェクト「d020」の準備を行い、「C:\DelphiProgram\jww」フォルダの中に「d020」というフォルダを作成し、Delphi6を起動します。メニュー「プロジェクト」→「オプション」を実行し、下記の設定を行います。
[アプリケーション]頁
 タイトル
d020−お絵描きソフト
[ディレクトリ/条件]頁
 パス及びディレクトリ
C:\DelphiProgram\db\d020

画面構成は取りあえず下記のようにします。d018をそのまま利用し、現在不要な部分・ファイルを削除しています。Form5(Unit5.pas)は削除しましたので、Form6(Unit6.pas)を Form5(Unit5.pas)に変更しています。一度にやってしまおうとするとミスする場合も多いので少しずつ進めます。

メニュー構成は現在下記の通り。

ここまでのソースプログラムを圧縮しています。
各画面やプログラム内容は下記で確認して下さい。
 
次に、お絵描きソフトのデータをテーブルデータにするとして、データは複数作成出来ると想定すれば、データ一覧を扱うテーブルが必要になると想定出来ます。
テーブル「IMGLIST」(TABLE3)
名前変数名内容
登録番号N整数 1,2,3,… 他と重複しない
作成者MN整数 「MEMBER」の登録番号
名前INAME文字(最大半角64文字)
メモ1MEMO1文字(最大半角80文字)
メモ2MEMO2文字(最大半角80文字)
メモ3MEMO3文字(最大半角80文字)
横サイズSX整数 8〜2000ドット(ピクセル)
縦サイズSY整数 8〜2000ドット(ピクセル)
作成日付DATE1文字(半角8文字)yyyymmdd形式
更新日付DATE2文字(半角8文字)yyyymmdd形式
これも前回のd018を利用して作ってみます。
メニュー追加:

新規作成及び編集画面(Form6;Unit6.pas):

一覧表示画面(Form7;Unit7.pas):

ここまでのソースプログラムを圧縮しています。
各画面やプログラム内容は下記で確認して下さい。
 
画像データ1つに対し、テーブルデータ1つを作成するものとして、テーブル名は「IMG_〜」のようにします。「〜」の箇所にはテーブル「IMGLIST」の登録番号「N」の値が入るものとし、「IMG_1」「IMG_2」…というテーブルデータを作成・編集します。
画像データテーブルは下記のようにします。
テーブル「IMG_〜」(TABLE4)
名前変数名内容
登録番号N整数 1,2,3,… 他と重複しない
作成者MN整数 「MEMBER」の登録番号
作図番号DN整数 1,2,3,…
ペン先PTYP整数 0:● 1:○ 2:■ 3:□ 4:/ 5:\
ペン太さPSIZ整数 1〜300
ペン色PCOL整数 24bit色($000000〜$ffffff)
位置XX整数 ドット(ピクセル)
位置YY整数 ドット(ピクセル)
作成者(MN)は、誰が描いた点かを保持します。作図番号はマウスで書き始め、マウスを離して書き終わるまでを同じ番号とします。
 
上記の d019 を利用して d020に組み込みます。「新規作成」「開く」については不要となります。「保存」は画像ファイルとして他のソフトで利用する場合のために置いておきます。お絵描き画面は Form8(Unit8.pas)、ペン先指定画面は Form9(Unit9.pas)となります。このForm8は Form7 の表からダブルクリックして選択/[詳細]ボタンをクリックで起動します。Form8のFormStyleプロパティを「fsMDIChild」にしてMDI子画面にします。
 
Form8起動時に、画像データテーブルを参照して以前の状態を画面に描画します。テーブルが存在しない場合は新規作成としてテーブルを作成します。絵の描画はマウスを押した時、押したまま移動した時に行っていますが、マウスを動かすたびにサーバーHDDがガシャガシャするのも何ですので、データの登録はマウスを離した時に一括して行うようにします。そのため、描画中の座標を動的配列に入れて作業するようにします。
 
同じ画像データを複数PCで開いている場合、描画させるだけでは足りません。他PCで描画された状態を表示しないと意味がありませんので、描画する直前に、他PCで描画されているかどうかをチェックして(データ数を確認します)、描画されている場合にはその内容を描画します。また、他PCと同時描画を行う可能性もあります。その場合、1つのPCだけが登録成功となり、それ以外はエラーとなります。ですのでエラーした場合には、登録番号を1増やしてリトライするようにして、リトライ直前に他PCで描画した内容を画面に表示するようにします。勿論その処理によりデータ登録がどんどん遅れてしまう可能性がありますが、データ登録漏れが起きてしまうよりも安全性(データが確実に登録される状態)を優先し、仕方がないと判断するのが良いように思われます。
 
また、このPCで何もしなくても、他PCで描画を行う可能性がありますので、時々自動更新をされるのが良いと思います。[System]内の Timer コンポーネントを利用して、何秒かおきに自動更新するようにしておきます。ここでは 5秒としておきます。タイマー割込をしますので各種処理の前後に割込禁止・割込許可を指示するようにします。
 
お絵描きソフトを使ってテストで落書きするとデータがどんどん巨大化して、不要なのに消したくても消せない、という場合に困ってしまうので、画像一覧表示画面(Form7;Unit7.pas)で[画像データ削除]ボタンを追加するようにしておきます。全てのPCでその画像を開いていない状態で利用して下さい。
 
なお、他PCで描画をしたかどうかをチェックするのにデータ数を確認する手法を使っていますが、このお絵描きソフトでは削除する事を考えていないため、それでも大丈夫なのですが、削除する機能を入れる場合には別の手法をとる必要がありますので注意して下さい。
 

 
ソース及び実行プログラムを圧縮しています



 
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
シェアウェア
Script!World
データベース
 A B C D
 E F G H
 I J K L
 M N O P
 Q R S T
 U V W X
 Y Z
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015. By AFsoft All Rights Reserved.