home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / PASM.LZH / PASMAPP.CPP < prev    next >
C/C++ Source or Header  |  1996-07-10  |  26KB  |  1,005 lines

  1. /*  Project partsasm
  2.     Project Team DoGA
  3.     Copyright (c) 1995. All Rights Reserved.
  4.  
  5.     サブシステム:    partsasm.exe Application
  6.     ファイル:        pasmapp.cpp
  7.     作成者:          Taka2
  8.  
  9.  
  10.     概要
  11.     ====
  12.     partsasmApp (TApplication) のインプリメンテーション用のソースファイル
  13. */
  14.  
  15.  
  16. #include <owl\owlpch.h>
  17. #pragma hdrstop
  18.  
  19. #include <owl\inputdia.h>
  20. #include <owl\statusba.h>
  21. #include "pasmapp.h"
  22. #include "prtssmad.h"                        // 「プログラムについて」ダイアログボックスの定義
  23. #include "winframe.h"
  24. #include "design.h"
  25. #include "parts.h"
  26. #include "partsdlg.h"
  27. #include "files.h"
  28. #include "fxg.h"
  29. #include "dslider.h"
  30. #include "dselcol.h"
  31. #include "rendexec.h"
  32. #include "suflib.h"
  33. #include "bmpopen.h"
  34. #include "syscolor.h"
  35. #include "log.h"
  36.  
  37. //{{partsasmApp Implementation}}
  38.  
  39. //const char *HelpFileName="partsasm.hlp";
  40. char HelpFileName[256];
  41.  
  42.  
  43. //
  44. // アプリケーションが処理するすべてのメッセージ/コマンドに対する応答テーブルを作成する
  45. //
  46. DEFINE_RESPONSE_TABLE1(partsasmApp, TApplication)
  47. //{{partsasmAppRSP_TBL_BEGIN}}
  48.     EV_COMMAND(CM_FILENEW, CmFileNew),                      EV_COMMAND_ENABLE(CM_FILENEW, CmFileNewEnable),
  49.     EV_COMMAND(CM_FILEOPEN, CmFileOpen),
  50.     EV_COMMAND(CM_FILESAVEAS, CmFileSaveAs),                EV_COMMAND_ENABLE(CM_FILESAVEAS, CmFileSaveAsEnable),
  51.     EV_COMMAND(CM_FILESAVE, CmFileSave),                    EV_COMMAND_ENABLE(CM_FILESAVE, CmFileSaveEnable),
  52.  
  53.     EV_COMMAND(CM_EDITDELETE, CmEditDelete),                EV_COMMAND_ENABLE(CM_EDITDELETE, CmEditDeleteEnable),
  54.     EV_COMMAND(CM_EDITDUP, CmEditDuplicate),                EV_COMMAND_ENABLE(CM_EDITDUP, CmEditDuplicateEnable),
  55.     EV_COMMAND(CM_PartsExchange, CmPartsExchange),          EV_COMMAND_ENABLE(CM_PartsExchange, CmPartsExchangeEnable),
  56.     EV_COMMAND(CM_EDITDUPX, CmEditDuplicateX),              EV_COMMAND_ENABLE(CM_EDITDUPX, CmEditDuplicateEnable),
  57.     EV_COMMAND(CM_EDITDUPY, CmEditDuplicateY),              EV_COMMAND_ENABLE(CM_EDITDUPY, CmEditDuplicateEnable),
  58.     EV_COMMAND(CM_EDITDUPZ, CmEditDuplicateZ),              EV_COMMAND_ENABLE(CM_EDITDUPZ, CmEditDuplicateEnable),
  59.     EV_COMMAND(CM_ALLSCALE, CmAllScale),                    EV_COMMAND_ENABLE(CM_ALLSCALE, CmAllScaleEnable),
  60.  
  61.     EV_COMMAND(CM_PartsCatalog, CmPartsCatalog),            EV_COMMAND_ENABLE(CM_PartsCatalog, CmPartsCatalogEnable),
  62.     EV_COMMAND(CM_PARTSINITROT, CmPartsInitRot),            EV_COMMAND_ENABLE(CM_PARTSINITROT, CmPartsInitRotEnable),
  63.     EV_COMMAND(CM_PARTSINITSCALE, CmPartsInitScale),        EV_COMMAND_ENABLE(CM_PARTSINITSCALE, CmPartsInitScaleEnable),
  64.  
  65.     EV_COMMAND(CM_FXGSHOW, CmFxgShow),                      EV_COMMAND_ENABLE(CM_FXGSHOW, CmFxgShowEnable),
  66.     EV_COMMAND(CM_RENDSHOW, CmRendShow),                    EV_COMMAND_ENABLE(CM_RENDSHOW, CmRendShowEnable),
  67.     EV_COMMAND(CM_RENDCOLOR, CmRendColor),                  EV_COMMAND_ENABLE(CM_RENDCOLOR, CmRendColorEnable),
  68.  
  69.     EV_COMMAND(CM_DISPZOOM, CmDispZoom),                    EV_COMMAND_ENABLE(CM_DISPZOOM, CmDispZoomEnable),
  70.     EV_COMMAND(CM_ETCSCALEDOWN, CmEtcScaleDown),            EV_COMMAND_ENABLE(CM_ETCSCALEDOWN, CmEtcScaleDownEnable),
  71.     EV_COMMAND(CM_ETCSCALEUP, CmEtcScaleUp),                EV_COMMAND_ENABLE(CM_ETCSCALEUP, CmEtcScaleUpEnable),
  72.     EV_COMMAND(CM_ETCMESHON, CmEtcMeshOn),                  EV_COMMAND_ENABLE(CM_ETCMESHON, CmEtcMeshOnEnable),
  73.     EV_COMMAND(CM_ETCMESHSPACING, CmEtcMeshSpacing),        EV_COMMAND_ENABLE(CM_ETCMESHSPACING, CmEtcMeshSpacingEnable),
  74.     EV_COMMAND(CM_ETCINITEYE, CmEtcInitEye),                EV_COMMAND_ENABLE(CM_ETCINITEYE, CmEtcInitEyeEnable),
  75.  
  76.     EV_COMMAND(CM_ETCHIDDENREMOVE, CmEtcHiddenRemove),        EV_COMMAND_ENABLE(CM_ETCHIDDENREMOVE, CmEtcHiddenRemoveEnable),
  77.     EV_COMMAND(CM_ETCGRID, CmEtcGrid),                      EV_COMMAND_ENABLE(CM_ETCGRID, CmEtcGridEnable),
  78.     EV_COMMAND(CM_ETCGRIDSPACE, CmEtcGridSpace),
  79.     EV_COMMAND(CM_ETCROTSPACE, CmEtcRotSpace),
  80.     EV_COMMAND(CM_ETCSCALESPACE, CmEtcScaleSpace),
  81.  
  82.     EV_COMMAND(CM_HELPCONTEXT, CmHelpContext),
  83.     EV_COMMAND(CM_HELPABOUT, CmHelpAbout),
  84.  
  85.     EV_COMMAND(CM_ETCSCALEONLY, CmEtcScaleOnly),
  86.     EV_COMMAND(CM_ETCROTONLY, CmEtcRotOnly),
  87.     EV_COMMAND(CM_ETCROTSCALE, CmEtcRotScaleCompound),
  88.     EV_COMMAND(CM_ETCINITTARGET, CmEtcInitTarget),
  89.     EV_COMMAND(CM_PARTSINITMOVE, CmPartsInitMove),
  90.  
  91.     EV_COMMAND_ENABLE(CM_ETCROTONLY, CmEtcRotOnlyEnable),
  92.     EV_COMMAND_ENABLE(CM_ETCSCALEONLY, CmEtcScaleOnlyEnable),
  93.     EV_COMMAND_ENABLE(CM_ETCROTSCALE, CmEtcRotScaleCompoundEnable),
  94.  
  95.     EV_COMMAND_ENABLE(CM_PARTSINITMOVE, CmPartsInitMoveEnable),
  96.  
  97.     EV_BN_CLICKED(BUTTON_OK, EvButtonOk),
  98. //{{partsasmAppRSP_TBL_END}}
  99. END_RESPONSE_TABLE;
  100.  
  101.  
  102.  
  103.  
  104. //////////////////////////////////////////////////////////
  105. // partsasmApp
  106. // =====
  107. //
  108. partsasmApp::partsasmApp () : TApplication("Parts Assembler")
  109. {
  110.     HelpState = FALSE;
  111.     execonce = FALSE;
  112.     // 「開く」と「名前を付けて保存」ダイアログボックスに共通の,ファイルフラグとフィルタ。ファイル名と
  113.     // ディレクトリは,メンバー関数 CmFileOpen と CmFileSaveAs で計算される
  114.     // INSERT>> コンストラクタ用のコードはここに
  115.  
  116. }
  117.  
  118.  
  119. partsasmApp::~partsasmApp ()
  120. {
  121.     // INSERT>> デストラクタ用のコードはここに
  122.  
  123. }
  124.  
  125.  
  126. //////////////////////////////////////////////////////////
  127. // partsasmApp
  128. // =====
  129. // アプリケーションの初期化
  130. //
  131. void partsasmApp::InitMainWindow ()
  132. {
  133.     TWinFrame *client = new TWinFrame(0);
  134.  
  135.     designdata = client->designdata;
  136.  
  137. //    TFrameWindow *frame = new TFrameWindow(0, GetName(), client, TRUE);
  138.     TDecoratedFrame *frame = new TDecoratedFrame(0, GetName(), client, TRUE);
  139.  
  140.     int screenX = GetSystemMetrics(SM_CXSCREEN);
  141.     int screenY = GetSystemMetrics(SM_CYSCREEN);
  142.     if (screenX <= 800) {
  143.         frame->Attr.W = screenX - 20;
  144.         frame->Attr.H = screenY - 60;
  145.     } else {
  146.         frame->Attr.W = 800;
  147.         frame->Attr.H = 600;
  148.     }
  149.  
  150.     // メインウィンドウ用の,デフォルトのウィンドウスタイルをオーバーライドする
  151.     frame->Attr.Style |= WS_BORDER | WS_CAPTION | WS_CLIPCHILDREN | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU | WS_THICKFRAME | WS_VISIBLE;
  152.     frame->Attr.Style &= ~(WS_CHILD);
  153.  
  154.     nCmdShow = nCmdShow != SW_SHOWMINIMIZED ? SW_SHOWNORMAL : nCmdShow;
  155.  
  156.     //
  157.     // このアプリケーションに,アイコンを設定する
  158.     //
  159.     frame->SetIcon(this, IDI_SDIAPPLICATION);
  160.  
  161.     //
  162.     // ウィンドウに対応したメニューと,テーブルに対応したアクセラレータのテーブル
  163.     //
  164.  
  165.     frame->AssignMenu(SDI_MENU);
  166.  
  167. #if 0
  168.     switch (fxgaflag) {
  169.     case PREVIEW_FXGA:
  170.         frame->AssignMenu(SDI_MENU);
  171.         break;
  172.     case PREVIEW_REND:
  173.         frame->AssignMenu(SDI_MENU_REND);
  174.         break;
  175.     case PREVIEW_BOTH:
  176.         frame->AssignMenu(SDI_MENU_BOTH);
  177.         break;
  178.     }
  179. #endif
  180.  
  181.     //
  182.     // アクセラレータテーブルへの関連付け
  183.     //
  184.     frame->Attr.AccelTable = SDI_MENU;
  185.  
  186.     frame->Insert(*designdata->InitStatusBar(), TDecoratedFrame::Bottom);
  187.  
  188.     SetMainWindow(frame);
  189.  
  190. }
  191.  
  192.  
  193. //////////////////////////////////////////////////////////
  194. // partsasmApp
  195. // ===========
  196. // 「ファイル」メニューの「新規作成」コマンド
  197. void partsasmApp::CmFileNew ()
  198. {
  199.     TWindow *client = TYPESAFE_DOWNCAST(GetMainWindow()->GetClientWindow(), TWindow);     // フレーム用のクライアントウィンドウ
  200.     if (client->CanClose()) {
  201.         designdata->FileNew();
  202.     }
  203. }
  204.  
  205.  
  206. //////////////////////////////////////////////////////////
  207. // partsasmApp
  208. // ===========
  209. // 「ファイル」メニューの「開く」コマンド
  210. void partsasmApp::CmFileOpen ()
  211. {
  212.     //
  213.     // 標準の「開く」ダイアログボックスを表示し,ファイル名を選ぶ
  214.     //
  215.  
  216. #if 0
  217.     TOpenSaveDialog::TData FileData(
  218.                             OFN_FILEMUSTEXIST | OFN_HIDEREADONLY,
  219.                             "フレームファイル(*.fsc)|*.fsc|",
  220.                             0, designdata->filedir, "FSC");
  221.     TWindow *client = TYPESAFE_DOWNCAST(GetMainWindow()->GetClientWindow(), TWindow);     // フレーム用のクライアントウィンドウ
  222.     if (client->CanClose()) {
  223.         if (TFileOpenDialog(GetMainWindow(), FileData).Execute() == IDOK) {
  224.             designdata->FileRead(FileData.FileName);
  225.         }
  226.     }
  227. #else
  228.     #ifndef MAX_PATH
  229.         #define MAX_PATH 256
  230.     #endif
  231.     if (GetMainWindow()->CanClose()) {
  232.         char fname[MAX_PATH];
  233.         if (FileOpenDialogWithBMP(
  234.                         GetMainWindow(),fname,
  235.                             OFN_FILEMUSTEXIST | OFN_HIDEREADONLY,
  236.                             "フレームファイル(*.fsc)|*.fsc|",
  237.                             0, designdata->filedir, "FSC") == IDOK) {
  238.             designdata->FileRead(fname);
  239.         }
  240.     }
  241. #endif
  242. }
  243.  
  244.  
  245. //////////////////////////////////////////////////////////
  246. // partsasmApp
  247. // ===========
  248. // 「ヘルプ」メニューの「partsasm.exe について」コマンド
  249. void partsasmApp::CmHelpAbout ()
  250. {
  251.     //
  252.     // モーダルダイアログを表示する
  253.     //
  254.     partsasmAboutDlg(MainWindow).Execute();
  255. }
  256.  
  257.  
  258. int OwlMain (int /*argc*/, char* /*argv*/[])
  259. {
  260.     partsasmApp     App;
  261.     int             result;
  262.  
  263.     FileInit();
  264.     sprintf(HelpFileName, "%sPARTSASM.HLP", pathdir.c_str());
  265.  
  266.     Object::UsePoly();
  267.  
  268.     result = App.Run();
  269.  
  270.     return result;
  271. }
  272.  
  273. void partsasmApp::CmPartsAdd ()
  274. {
  275.     // INSERT>> 追加コードはここに
  276.  
  277.     TOpenSaveDialog::TData FileData(
  278.                             OFN_FILEMUSTEXIST | OFN_HIDEREADONLY,
  279.                             "形状ファイル(*.suf)|*.suf|"
  280.                             "すべてのファイル(*.*)|*.*|",
  281.                             0, "", "suf");
  282.     TFileOpenDialog OpenDlg(GetMainWindow(), FileData);
  283.     //
  284.     // 標準の「開く」ダイアログボックスを表示し,ファイル名を選ぶ
  285.     //
  286.     if (OpenDlg.Execute() == IDOK) {
  287.         designdata->PartsAdd(FileData.FileName,
  288.             -(1.0/designdata->displayscale) * designdata->displayoffset);
  289.     }
  290. }
  291.  
  292. void partsasmApp::CmPartsCatalog ()
  293. {
  294.     // INSERT>> 追加コードはここに
  295.  
  296.     PartsDialog dialog(GetMainWindow(), designdata->cataloglastmenu, designdata->cataloglastparts);
  297.     if (dialog.Execute() == IDOK) {
  298.         designdata->PartsAdd(dialog.filename,
  299.             -(1.0/designdata->displayscale) * designdata->displayoffset);
  300.         designdata->cataloglastmenu = dialog.nowmenu;
  301.         designdata->cataloglastparts = dialog.nowparts;
  302.     }
  303. }
  304.  
  305.  
  306. void partsasmApp::CmEtcScaleDown ()
  307. {
  308.     // INSERT>> 追加コードはここに
  309.     designdata->ScaleDown();
  310. }
  311.  
  312.  
  313. void partsasmApp::CmEtcScaleDownEnable (TCommandEnabler &tce)
  314. {
  315.     // INSERT>> 追加コードはここに
  316.     tce.Enable(designdata->ScaleDownLimitCheck());
  317. }
  318.  
  319. void partsasmApp::CmEtcScaleUp ()
  320. {
  321.     // INSERT>> 追加コードはここに
  322.     designdata->ScaleUp();
  323. }
  324.  
  325. void partsasmApp::CmEtcScaleUpEnable (TCommandEnabler &tce)
  326. {
  327.     // INSERT>> 追加コードはここに
  328.     tce.Enable(designdata->ScaleUpLimitCheck());
  329. }
  330.  
  331. void partsasmApp::CmEditDelete ()
  332. {
  333.     // INSERT>> 追加コードはここに
  334.     designdata->PartsDelete(designdata->select);
  335. }
  336.  
  337.  
  338. void partsasmApp::CmEditDuplicate ()
  339. {
  340.     // INSERT>> 追加コードはここに
  341.        designdata->PartsCopy(designdata->select);
  342. }
  343.  
  344.  
  345. void partsasmApp::CmEditDuplicateX ()
  346. {
  347.     // INSERT>> 追加コードはここに
  348.        designdata->PartsCopy(designdata->select, SelX);
  349. }
  350.  
  351.  
  352. void partsasmApp::CmEditDuplicateY ()
  353. {
  354.     // INSERT>> 追加コードはここに
  355.        designdata->PartsCopy(designdata->select, SelY);
  356. }
  357.  
  358.  
  359. void partsasmApp::CmEditDuplicateZ ()
  360. {
  361.     // INSERT>> 追加コードはここに
  362.        designdata->PartsCopy(designdata->select, SelZ);
  363. }
  364.  
  365.  
  366. void partsasmApp::CmFileSaveAs ()
  367. {
  368.     // INSERT>> 追加コードはここに
  369.  
  370. #if 0
  371.     TOpenSaveDialog::TData FileData(
  372.                             OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  373.                             "フレームファイル(*.fsc)|*.fsc|",
  374.                             0, designdata->filedir, "FSC");
  375.  
  376.     if (TFileSaveDialog(GetMainWindow(), FileData).Execute() == IDOK) {
  377.         designdata->FileWrite(FileData.FileName);
  378.     }
  379. #else
  380.     char fname[MAX_PATH];
  381.     if (FileSaveDialogWithBMP(
  382.                 GetMainWindow(), fname,
  383.                 OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  384.                 "フレームファイル(*.fsc)|*.fsc|",
  385.                 0, designdata->filedir, "FSC") == IDOK) {
  386.         designdata->FileWrite(fname);
  387.     }
  388. #endif
  389.  
  390. }
  391.  
  392.  
  393. void partsasmApp::CmFileSave ()
  394. {
  395.     // INSERT>> 追加コードはここに
  396.  
  397.        designdata->FileWrite();
  398. }
  399.  
  400.  
  401. void partsasmApp::CmFileSaveEnable (TCommandEnabler &tce)
  402. {
  403.     // INSERT>> 追加コードはここに
  404.  
  405.     tce.Enable(designdata->filename[0] != '\0');
  406. }
  407.  
  408. void partsasmApp::CmEtcScaleOnly ()
  409. {
  410.     // INSERT>> 追加コードはここに
  411.  
  412.     designdata->dragtype = DragScaleOnly;
  413.     if (designdata->select != NULL) {
  414.         designdata->Redraw();
  415.     }
  416. }
  417.  
  418. void partsasmApp::CmEtcScaleOnlyEnable (TCommandEnabler &tce)
  419. {
  420.     // INSERT>> 追加コードはここに
  421.     if (designdata->dragtype == DragScaleOnly) {
  422.         tce.SetCheck(1);
  423.     } else {
  424.         tce.SetCheck(0);
  425.     }
  426. }
  427.  
  428. void partsasmApp::CmEtcRotOnly ()
  429. {
  430.     // INSERT>> 追加コードはここに
  431.  
  432.     designdata->dragtype = DragRotOnly;
  433.     if (designdata->select != NULL) {
  434.         designdata->Redraw();
  435.     }
  436. }
  437.  
  438. void partsasmApp::CmEtcRotOnlyEnable (TCommandEnabler &tce)
  439. {
  440.     // INSERT>> 追加コードはここに
  441.  
  442.     if (designdata->dragtype == DragRotOnly) {
  443.         tce.SetCheck(1);
  444.     } else {
  445.         tce.SetCheck(0);
  446.     }
  447. }
  448.  
  449.  
  450. void partsasmApp::CmEtcRotScaleCompound ()
  451. {
  452.     // INSERT>> 追加コードはここに
  453.  
  454.     designdata->dragtype = DragCompound;
  455.     if (designdata->select != NULL) {
  456.         designdata->Redraw();
  457.     }
  458. }
  459.  
  460. void partsasmApp::CmEtcRotScaleCompoundEnable (TCommandEnabler &tce)
  461. {
  462.     // INSERT>> 追加コードはここに
  463.  
  464.     if (designdata->dragtype == DragCompound) {
  465.         tce.SetCheck(1);
  466.     } else {
  467.         tce.SetCheck(0);
  468.     }
  469. }
  470.  
  471.  
  472.  
  473. void partsasmApp::CmEditDuplicateEnable (TCommandEnabler &tce)
  474. {
  475.     // INSERT>> 追加コードはここに
  476.     tce.Enable(designdata->select != NULL
  477.      && designdata->select != designdata->camera
  478.      && designdata->zoommode != ZoomSelect);
  479. }
  480.  
  481.  
  482. void partsasmApp::CmEditDeleteEnable (TCommandEnabler &tce)
  483. {
  484.     // INSERT>> 追加コードはここに
  485.     tce.Enable(designdata->select != NULL && designdata->select != designdata->camera && designdata->zoommode != ZoomSelect);
  486. }
  487.  
  488. void partsasmApp::CmEtcGridSpace ()
  489. {
  490.     // INSERT>> 追加コードはここに
  491.  
  492.  
  493.     char *buf[] = {"20", "50", "100", "200", "250", "300", "400", "500",NULL};
  494.     int pos;
  495.     for (pos = 0; buf[pos] != NULL; pos++) {
  496.         if (designdata->gridspacing == atoi(buf[pos])) {
  497.             break;
  498.         }
  499.     }
  500.     if (buf[pos] == NULL) pos = 1;
  501.     TDSliderInput dialog(MainWindow, "移動グリッド量設定", "位置設定の最小単位を設定してください", buf, pos);
  502.     if (dialog.Execute() == IDOK) {
  503.         designdata->gridspacing = atoi(buf[pos]);
  504.     }
  505.  
  506. #if 0
  507.     char str[16];
  508.     sprintf(str, "%d", designdata->gridspacing);
  509.     TInputDialog dialog(MainWindow, "移動グリッド量設定", "位置設定の最小単位を入力してください", str, 16);
  510.     if (dialog.Execute() == IDOK) {
  511.         int n = atoi(str);
  512.         if (0 < n && n < 1000) {
  513.             designdata->gridspacing = n;
  514.             designdata->Redraw(SelXYZ, TRUE);
  515.         }
  516.     }
  517. #endif
  518. }
  519.  
  520.  
  521. void partsasmApp::CmEtcRotSpace ()
  522. {
  523.     // INSERT>> 追加コードはここに
  524.  
  525.     char *buf[] = {"2", "5", "10", "15", "20", "30", "45",NULL};
  526.     int pos;
  527.     for (pos = 0; buf[pos] != NULL; pos++) {
  528.         if (designdata->rotspacing == atoi(buf[pos])) {
  529.             break;
  530.         }
  531.     }
  532.     if (buf[pos] == NULL) pos = 5;
  533.     TDSliderInput dialog(MainWindow, "回転グリッド量設定", "回転角度の最小単位を設定してください", buf, pos);
  534.     if (dialog.Execute() == IDOK) {
  535.         designdata->rotspacing = atoi(buf[pos]);
  536.     }
  537.  
  538. #if 0
  539.     char str[16];
  540.     sprintf(str, "%d", designdata->rotspacing);
  541.     TInputDialog dialog(MainWindow, "回転グリッド量設定", "回転角度の最小単位を入力してください", str, 16);
  542.     if (dialog.Execute() == IDOK) {
  543.         int n = atoi(str);
  544.         if (0 < n && n < 1000) {
  545.             designdata->rotspacing = n;
  546.         }
  547.     }
  548. #endif
  549. }
  550.  
  551.  
  552. void partsasmApp::CmEtcScaleSpace ()
  553. {
  554.     // INSERT>> 追加コードはここに
  555.  
  556.     char *buf[] = {"0.05", "0.1", "0.2", "0.5", NULL};
  557.     int pos;
  558.     for (pos = 0; buf[pos] != NULL; pos++) {
  559.         if (designdata->scalespacing == (int)(atof(buf[pos]) * scalespacingfactor)) {
  560.             break;
  561.         }
  562.     }
  563.     if (buf[pos] == NULL) pos = 3;
  564.     TDSliderInput dialog(MainWindow, "拡大グリッド量設定", "拡大倍率の最少単位を設定してください", buf, pos);
  565.     if (dialog.Execute() == IDOK) {
  566.         designdata->scalespacing = atof(buf[pos]) * scalespacingfactor;
  567.     }
  568.  
  569. #if 0
  570.     char str[16];
  571.     sprintf(str, "%5.2lf", designdata->scalespacing / scalespacingfactor);
  572.     TInputDialog dialog(MainWindow, "拡大グリッド量設定", "拡大倍率の最少単位を入力してください", str, 16);
  573.     if (dialog.Execute() == IDOK) {
  574.         double d;
  575.         sscanf(str, "%lf", &d);
  576.         int n = d * scalespacingfactor;
  577.         if (0 < n && n < 10000) {
  578.             designdata->scalespacing = n;
  579.         }
  580.     }
  581. #endif
  582. }
  583.  
  584.  
  585. void partsasmApp::CmEtcInitEye ()
  586. {
  587.     // INSERT>> 追加コードはここに
  588.     designdata->camera->position = Vector(1200,-900,900);
  589. //    designdata->camera->SetTarget(designdata->camera->target);
  590.     designdata->camera->SetTarget(Vector(0,0,0));
  591.     designdata->CalcPoints(designdata->camera);
  592.     designdata->CalcViewAll();
  593.     designdata->editflag++;
  594.     designdata->Redraw();
  595.  
  596. }
  597.  
  598.  
  599. void partsasmApp::CmEtcInitTarget ()
  600. {
  601.     // INSERT>> 追加コードはここに
  602.     designdata->camera->SetTarget(Vector(0,0,0));
  603.     designdata->CalcPoints(designdata->camera);
  604.     designdata->CalcViewAll();
  605.     designdata->editflag++;
  606.     designdata->Redraw();
  607.  
  608. }
  609.  
  610.  
  611. void partsasmApp::CmPartsExchange ()
  612. {
  613.     // INSERT>> 追加コードはここに
  614.     PartsDialog dialog(GetMainWindow(), designdata->cataloglastmenu, designdata->cataloglastparts);
  615.     if (dialog.Execute() == IDOK) {
  616.         Vector p = designdata->select->position;
  617.         Vector r = designdata->select->rotation;
  618.         Vector s = designdata->select->scale;
  619.         designdata->PartsDelete(designdata->select);
  620.         designdata->PartsAdd(dialog.filename, p, r, s);
  621.         designdata->cataloglastmenu = dialog.nowmenu;
  622.         designdata->cataloglastparts = dialog.nowparts;
  623.     }
  624. }
  625.  
  626.  
  627. void partsasmApp::CmPartsExchangeEnable (TCommandEnabler &tce)
  628. {
  629.     // INSERT>> 追加コードはここに
  630.     tce.Enable(designdata->select != NULL && designdata->select != designdata->camera && designdata->zoommode != ZoomSelect);
  631.  
  632. }
  633.  
  634. void partsasmApp::CmEtcHiddenRemove ()
  635. {
  636.     // INSERT>> 追加コードはここに
  637.     designdata->hiddenremove = ! designdata->hiddenremove;
  638.        designdata->BuildWireFrame();
  639.     designdata->Redraw(SelPers);
  640. }
  641.  
  642.  
  643. void partsasmApp::CmEtcHiddenRemoveEnable (TCommandEnabler &tce)
  644. {
  645.     // INSERT>> 追加コードはここに
  646.     tce.SetCheck(designdata->hiddenremove);
  647. }
  648.  
  649. void partsasmApp::CmEtcGrid ()
  650. {
  651.     // INSERT>> 追加コードはここに
  652.     designdata->gridflag = ! designdata->gridflag;
  653.     designdata->Redraw(SelStat);
  654. }
  655.  
  656.  
  657. void partsasmApp::CmEtcGridEnable (TCommandEnabler &tce)
  658. {
  659.     // INSERT>> 追加コードはここに
  660.  
  661.    if (designdata->gridflag) {
  662.         tce.SetCheck(1);
  663.     } else {
  664.         tce.SetCheck(0);
  665.     }
  666. //    tce.Enable(designdata->zoommode != ZoomSelect);
  667. }
  668.  
  669.  
  670. void partsasmApp::CmPartsInitMove ()
  671. {
  672.     // INSERT>> 追加コードはここに
  673.  
  674.        designdata->select->position = Vector(0,0,0);
  675.     designdata->CalcPoints(designdata->select);
  676.     designdata->editflag++;
  677.     designdata->Redraw();
  678. }
  679.  
  680.  
  681. void partsasmApp::CmPartsInitMoveEnable (TCommandEnabler &tce)
  682. {
  683.     // INSERT>> 追加コードはここに
  684.  
  685.     tce.Enable(designdata->select != NULL && designdata->select != designdata->camera);
  686. }
  687.  
  688.  
  689. void partsasmApp::CmPartsInitRot ()
  690. {
  691.     // INSERT>> 追加コードはここに
  692.  
  693.        designdata->select->rotation = Vector(0,0,0);
  694.     designdata->CalcPoints(designdata->select);
  695.     designdata->editflag++;
  696.     designdata->Redraw();
  697. }
  698.  
  699.  
  700. void partsasmApp::CmPartsInitRotEnable (TCommandEnabler &tce)
  701. {
  702.     // INSERT>> 追加コードはここに
  703.  
  704.     tce.Enable(designdata->select != NULL && designdata->select != designdata->camera && designdata->zoommode != ZoomSelect);
  705. }
  706.  
  707.  
  708. void partsasmApp::CmPartsInitScale ()
  709. {
  710.     // INSERT>> 追加コードはここに
  711.  
  712.        designdata->select->scale = Vector(1,1,1);
  713.     designdata->CalcPoints(designdata->select);
  714.     designdata->editflag++;
  715.     designdata->Redraw();
  716. }
  717.  
  718.  
  719. void partsasmApp::CmPartsInitScaleEnable (TCommandEnabler &tce)
  720. {
  721.     // INSERT>> 追加コードはここに
  722.  
  723.     tce.Enable(designdata->select != NULL && designdata->select != designdata->camera && designdata->zoommode != ZoomSelect);
  724. }
  725.  
  726.  
  727. void partsasmApp::CmFxgShow ()
  728. {
  729.     static char *title        ="FXGA メカデザイン表示";
  730.     if (FindWindow(NULL, title) != NULL) {
  731.         GetMainWindow()->MessageBox("現在実行中です", title, MB_OK);
  732.     } else {
  733.         FXG_Show(designdata->parts);
  734.         designdata->statusbar->SetText("SELECT:任意・回転・直進 I:色変更 II:床表示 III:縮小 IV:拡大 V:スペキュラー VI:背景表示");
  735.     }
  736. }
  737.  
  738. void partsasmApp::CmFxgShowEnable (TCommandEnabler &tce)
  739. {
  740.     tce.Enable(designdata->parts != NULL && designdata->zoommode != ZoomSelect);
  741. }
  742.  
  743. void partsasmApp::CmRendShow ()
  744. {
  745.     static char *title = "REND for Windows";
  746.     HWND hRend;
  747.     if (designdata->camera->position.x != designdata->camera->target.x
  748.      || designdata->camera->position.y != designdata->camera->target.y) {
  749.         if ((hRend = FindWindow(NULL, title)) != NULL) {
  750.             ::SendMessage(hRend, WM_CLOSE, 0, 0);
  751.         }
  752.         RendMechanic(designdata->parts, designdata->camera, designdata->color);
  753.     }
  754. }
  755.  
  756. void partsasmApp::CmRendShowEnable (TCommandEnabler &tce)
  757. {
  758.     tce.Enable(designdata->parts != NULL
  759.      && designdata->zoommode != ZoomSelect
  760.      && (designdata->camera->position.x != designdata->camera->target.x
  761.       || designdata->camera->position.y != designdata->camera->target.y));
  762. }
  763.  
  764. void partsasmApp::CmRendColor ()
  765. {
  766.     char opt[1024], *s, *d;
  767.     int w=320, h=240;
  768.     strcpy(opt, rendoption.c_str());
  769.     for (s = d = opt; *s; ) {
  770.         if ((*s == '-' || *s == '/') && (s[1] == 'c' || s[1] == 'C')) {
  771.             s+=2;
  772.             w = atoi(s);
  773.             while (*s && isdigit(*s)) s++;
  774.             if (*s) {
  775.                 s++;
  776.                 if (isdigit(*s)) {
  777.                     h = atoi(s);
  778.                 }
  779.                 while(*s && !isspace(*s)) s++;
  780.                 if (*s) s++;
  781.             }
  782.         } else {
  783.             *d++ = *s++;
  784.         }
  785.     }
  786.     while (d > opt  && isspace(d[-1])) d--;
  787.     *d = '\0';
  788.     LightType lt;
  789.     int ilt = 0;
  790.     lt = Parts::GetLightType();
  791.     if (lt == LightRightUpper || lt == LightRightLower) {
  792.         ilt = 1;
  793.     }
  794.     TDSelColor dialog(MainWindow, designdata->color, ilt, w, h);
  795.     if (dialog.Execute() == IDOK) {
  796.         if (designdata->color != (RendColor)dialog.selcolor) {
  797.             designdata->color = (RendColor)dialog.selcolor;
  798.             char *cname[5] = {"白","青","赤","緑","紫"};
  799.             rendcolor = cname[dialog.selcolor];
  800.         }
  801.         Parts::SetLightType(dialog.sellight ? LightRightUpper : LightLeftUpper);
  802.         rendlight = dialog.sellight ? "右上" : "左上";
  803.         if (w != dialog.selwidth || h != dialog.selheight) {
  804.             w = dialog.selwidth;
  805.             h = dialog.selheight;
  806.             sprintf(opt+strlen(opt), " -c%d:%d:%d:%d", w, h, w, h);
  807.             rendoption = opt;
  808.         }
  809.         FileWriteRendOption();
  810.     }
  811. }
  812.  
  813. void partsasmApp::CmRendColorEnable (TCommandEnabler &tce)
  814. {
  815.     tce.Enable(designdata->zoommode != ZoomSelect);
  816. }
  817.  
  818.  
  819. void partsasmApp::EvButtonOk(void)
  820. {
  821. //    logprintf("ButtonOk\n");
  822. }
  823.  
  824.  
  825. void partsasmApp::CmEtcMeshOn ()
  826. {
  827.     // INSERT>> 追加コードはここに
  828.  
  829.     designdata->meshflag = !designdata->meshflag;
  830.     designdata->Redraw(SelXYZ);
  831. }
  832.  
  833.  
  834. void partsasmApp::CmEtcMeshOnEnable (TCommandEnabler &tce)
  835. {
  836.     // INSERT>> 追加コードはここに
  837.     tce.SetCheck(designdata->meshflag != FALSE);
  838.     tce.Enable(designdata->zoommode != ZoomSelect);
  839. }
  840.  
  841.  
  842. void partsasmApp::CmEtcMeshSpacing ()
  843. {
  844.     // INSERT>> 追加コードはここに
  845.  
  846.     char *buf[] = {"50", "100", "200", "250", "300", "400", "500", NULL};
  847.     int pos;
  848.     for (pos = 0; buf[pos] != NULL; pos++) {
  849.         if (designdata->meshspacing == atoi(buf[pos])) {
  850.             break;
  851.         }
  852.     }
  853.     if (buf[pos] == NULL) pos = 5;
  854.     TDSliderInput dialog(MainWindow, "メッシュ間隔設定", "メッシュの間隔を設定してください", buf, pos);
  855.     if (dialog.Execute() == IDOK) {
  856.         designdata->meshspacing = atoi(buf[pos]);
  857.         designdata->Redraw(SelXYZ, TRUE);
  858.     }
  859.  
  860.  
  861. #if 0
  862.     char str[16];
  863.     sprintf(str, "%d", designdata->meshspacing);
  864.     TInputDialog dialog(MainWindow, "メッシュ間隔設定", "メッシュの間隔を入力してください", str, 16);
  865.     if (dialog.Execute() == IDOK) {
  866.         int n = atoi(str);
  867.         if (0 < n && n < 10000) {
  868.             designdata->meshspacing = n;
  869.             designdata->Redraw(SelXYZ, TRUE);
  870.         }
  871.     }
  872. #endif
  873.  
  874. }
  875.  
  876.  
  877. void partsasmApp::CmEtcMeshSpacingEnable (TCommandEnabler &tce)
  878. {
  879.     tce.Enable(designdata->zoommode != ZoomSelect);
  880. }
  881.  
  882.  
  883. void partsasmApp::CmAllScale ()
  884. {
  885.     // INSERT>> 追加コードはここに
  886.  
  887.     char *buf[] = {"0.5", "0.6", "0.7", "0.8", "0.9", "1.0",  "1.1", "1.2", "1.3", "1.4", "1.5", NULL};
  888.     int pos = 5;
  889.     TDSliderInput dialog(MainWindow,"物体全体拡大", "物体全体の拡大倍率を設定してください", buf, pos);
  890.     if (dialog.Execute() == IDOK) {
  891.         double r = atof(buf[pos]);
  892.         designdata->TotalScaling(r);
  893.     }
  894. }
  895.  
  896.  
  897. void partsasmApp::CmAllScaleEnable (TCommandEnabler &tce)
  898. {
  899.     // INSERT>> 追加コードはここに
  900.  
  901.     tce.Enable(designdata->parts != NULL && designdata->zoommode != ZoomSelect);
  902. }
  903.  
  904.  
  905. void partsasmApp::CmHelpContext ()
  906. {
  907.     HelpState = GetMainWindow()->WinHelp(HelpFileName, HELP_CONTENTS, 0L);
  908. }
  909.  
  910.  
  911. void partsasmApp::CmFileSaveAsEnable (TCommandEnabler &tce)
  912. {
  913.     // INSERT>> 追加コードはここに
  914.     tce.Enable(designdata->parts != NULL);
  915. }
  916.  
  917.  
  918. void partsasmApp::CmFileNewEnable (TCommandEnabler &tce)
  919. {
  920.     // INSERT>> 追加コードはここに
  921.     tce.Enable(designdata->parts != NULL);
  922. }
  923.  
  924.  
  925. void partsasmApp::CmDispZoom ()
  926. {
  927.     // INSERT>> 追加コードはここに
  928.  
  929.     designdata->SelectZoom();
  930.  
  931. }
  932.  
  933.  
  934. void partsasmApp::CmDispZoomEnable (TCommandEnabler &tce)
  935. {
  936.     // INSERT>> 追加コードはここに
  937.  
  938.     tce.SetCheck(designdata->zoommode != ZoomNone);
  939. }
  940.  
  941.  
  942.  
  943. void partsasmApp::CmPartsCatalogEnable (TCommandEnabler &tce)
  944. {
  945.     // INSERT>> 追加コードはここに
  946.  
  947.     tce.Enable(designdata->zoommode != ZoomSelect);
  948. }
  949.  
  950.  
  951. void partsasmApp::CmEtcInitEyeEnable (TCommandEnabler &tce)
  952. {
  953.     // INSERT>> 追加コードはここに
  954.     tce.Enable(designdata->zoommode != ZoomSelect);
  955. }
  956.  
  957.  
  958. BOOL partsasmApp::CanClose ()
  959. {
  960.     BOOL result = TApplication::CanClose();
  961.  
  962.     if (result && HelpState)
  963.            GetMainWindow()->WinHelp(HelpFileName, HELP_QUIT, 0L);
  964.  
  965.     static char *title = "REND for Windows";
  966.     HWND hRend;
  967.     if ((hRend = FindWindow(NULL, title)) != NULL) {
  968.         ::SendMessage(hRend, WM_CLOSE, 0, 0);
  969.     }
  970.  
  971.     return result;
  972. }
  973.  
  974.  
  975. BOOL partsasmApp::IdleAction (long idleCount)
  976. {
  977.     BOOL result;
  978.  
  979.     result = TApplication::IdleAction(idleCount);
  980.  
  981.     // INSERT>> 追加のコードはここに
  982.  
  983.     if (execonce != FALSE) {
  984.         return result;
  985.     }
  986.     execonce = TRUE;
  987.  
  988.     TWindow *client = GetMainWindow();
  989.     TClientDC dc(*client);
  990.     InitSysColor(dc);
  991.  
  992.     TMenu menu(GetMainWindow()->GetMenu());
  993.     TMenu submenu(menu.GetSubMenu(3));
  994.     if (fxgaflag == PREVIEW_FXGA) {
  995.         submenu.RemoveMenu(CM_RENDSHOW, MF_BYCOMMAND);
  996.         submenu.RemoveMenu(CM_RENDCOLOR, MF_BYCOMMAND);
  997.     } else if (fxgaflag == PREVIEW_REND) {
  998.         submenu.RemoveMenu(CM_FXGSHOW, MF_BYCOMMAND);
  999.     }
  1000.  
  1001.     return result;
  1002. }
  1003.  
  1004.  
  1005.