FC2ブログ
*admin*entry*file*plugin| 文字サイズ  

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。



今日はプログラミングについてのお話です。
仕事でNCプログラム弄ってるんですが、
機種によってプログラムを微妙に変更しないと
いけないんですよ、まぁそれが正直面倒なわけで。
以前使ったことあるもので実績あるから、直せば
ある程度ミスもなくスムーズに加工できるんですが。

そんな時上司からひとこと

「こんなもんすぐに変換できるやろ」

現状無理だから即答で「無理です」って答えましたが、
「現状」なだけなのでその手のプログラムを
ちょちょっと書いてみようかともくろみ中。
NCプログラムの中身はこれでもかというぐらい単純な
テキストデータなのでこれを組み替えるのもそれほど
難しくは無いはず?ということで作成。

基本は文字の置換と挿入になるわけだけど、音だけ
聞くとなんか卑猥な表現になっちゃいますねぇ。

決まった法則に則って書き換えるんだからそんなもん
PCにやらせておけばいいんだよ、って言うのが本音。
わざわざ人の手介入させてミスしたら元も子もない、
ミスが起きる原因は9割方ヒューマンエラーだし。

ミスのない書き換えプログラムを一度ぐらい完璧に
作ることはできるし、あとは任せたってことで。



よく使いそうなものだけ抜粋して紹介しておきます。
特にプログラムは企業秘密とかそんな事無いので、
というか私が勝手に作ってるだけなんですけど。

ちなみにVC++のエクスプレスで開発(2008)
2008使うのはIntelliSenseが2010だと使えないという
致命的な欠陥が・・・使う場合は有償($99)で提供してるとか。

作るのは面倒なので[Windowsフォームアプリケーション]
まぁ、これで十分でしょ、特殊な処理全くしないし。

手順としては・・・

①ファイルオープン
②一行ずつ変数に代入
③条件によって書き換え
④ファイル最後まで変数に代入
⑤置換させる部分が文末にある場合はそれを施工
⑥ファイル書き出し
⑦ファイルクローズ


たぶんこんな感じで進めていきます、というか行ってます。
まず最初に必要なのは①のファイルオープン

#include 
#include
using namespace System::IO;
using namespace std;


これは必要そうなInclude


この部分はなんか勝手に表示されてるみたい・・・
</stdio.h></string>

private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {

//FILE *file;
//char s[256];
System::Windows::Forms::DialogResult ret;
using namespace System::Runtime::InteropServices;
String ^tx,^tx2,^tx3,^tx5;
int i,j,m,n,ret2,ret3;
bool k,l;
double I,J,X,Y;
string tx4[1024];
/*errno_t error;
using namespace System::Runtime::InteropServices;
const char* FileName = (const char*)(Marshal::StringToHGlobalAnsi(textBox1->Text)).ToPointer();//Stringからconst char*

#pragma warning(disable:4996)//オーバーフローによるメモリ領域破壊の危険性 ->無視
file = fopen(FileName, "r");

if ( (error = fopen_s(&file,FileName,"r")) != 0 ) {
return;// エラー処理
}
Marshal::FreeHGlobal(System::IntPtr((void*)FileName));//開放 */

if (textBox1->Text == "") return;
if (File::Exists(textBox1->Text)){
}
else{
ret = MessageBox::Show("ファイルが存在しません!!","警告",MessageBoxButtons::OK,MessageBoxIcon::Error);
textBox1->Focus();
return;
}

if (textBox2->Text == "") return;

else if (Directory::Exists(Path::GetDirectoryName(textBox2->Text))){
}
else{
ret = MessageBox::Show("ディレクトリが存在しません!!","警告",MessageBoxButtons::OK,MessageBoxIcon::Error);
textBox2->Focus();
return;
}

FileStream^ fs = gcnew FileStream(textBox1->Text,FileMode::Open);
StreamReader^ sr = gcnew StreamReader(fs,System::Text::Encoding::GetEncoding("Shift-JIS"));


FileStream使う方でやってます。File*使ってもいいのだろうけど
正直何がいいのかよく解からんので動けばOK
コメントアウトしてるのがその部分。
その後適当に変数宣言してファイルオープンとクリエイトの処理。

ディレクトリがない場合は作ればいいんですが、面倒なので
速攻警告で切り捨て (҂˘̀^˘́)9

次に必要なのが比較、とある文字列を含むか含まないかを
判断してそれに応じた処理を行う。

int StrMatch( const char *Ptn, const char *Str ){
switch( *Ptn ){
case '\0':
return (*Str=='\0');
case '*':
return StrMatch( Ptn+1, Str ) || (*Str!='\0') && StrMatch( Ptn, Str+1 );
case '?':
return (*Str!='\0') && StrMatch( Ptn+1, Str+1 );
default:
return ((unsigned char)*Ptn==(unsigned char)*Str) && StrMatch( Ptn+1, Str+1 );
}
}//StrMatch


これに入れると比較して真なら「1」を返してくれるらしい。
ワイルドカード("*"と"?")使ってるので要らんものまで拾っちゃいます。
そんな時使うのが次のソース、これはその文字列が数字だけ
なのかそうでないのかを判断してくれます。

static bool IsNumeric(System::String^ stTarget) {
double dNullable;

return System::Double::TryParse(
stTarget,
System::Globalization::NumberStyles::Any,
nullptr,
dNullable
);
}
static bool IsNumeric(System::Object^ oTarget) {
return IsNumeric(oTarget->ToString());
}


ちなみにtx4[i]っていうのが各行が入ったstd::stringの配列で、
書き込む時、置換するときに使用します。
文末に置換させるものがある場合があるので、一度全部
読んでからじゃないと判断できないのですよ。
こんな感じで、最後のほうにループで書き込んでます。

FileStream^ fs2 = gcnew FileStream(textBox2->Text,FileMode::Create);
StreamWriter^ sr2 = gcnew StreamWriter(fs2,System::Text::Encoding::GetEncoding("Shift-JIS"));

i =0;
while( i != m){
tx2 = ToSystemString(tx4[i],System::Text::Encoding::GetEncoding("Shift-JIS"));
sr2->WriteLine(tx2);
sr2->Flush();//これ入れないとファイルが途中で途切れる可能性がある バッファのバグ?
i++;
}

fs2->Close();


やってるのってこれぐらいじゃないかな?
あとはあっちやったりこっちやったりで適当に処理。
それぞれの変数を適した型への変換も必要なのだけど、
うわぁ・・・全然やることねぇ~(´・ω・`)

一番問題なのはどうやって入れ替えるか、ですかね?
間違えるとめっちゃでたらめなモン出してくれるし。
言う通りに動けよ・・・って動いてるんですけどね。


何故かプログラム弄るときは大抵文字列を弄ってる?
画像処理とかもしないと何の役にもたたんのだが。
(書籍だけ手元に転がってる惨状・・・)


絵とモデルについてはもうしばしお待ちを、
今日は冷える、お風呂はいろ。ヽ(´ー`)┌


【】
いいね
【Re: タイトルなし】
> 河合潤也 さん

プログラミングもハマると時間経つの忘れちゃいますね・・・
難しいというよりややこしいだけなのですが。
この程度ならフリーでできるのでとてもありがたいです。(╹◡╹)
この記事へコメントする















Mithril

Author:Mithril


趣味は主に雑学です。
どうでもいいこと書いてます。

Blenderやプログラムに
ついても書いたりするかも。
私のPC環境はこちら

メールはこちらから↓
mithrilp★yahoo.co.jp
(★を@に変えて下さい)

11 | 2018/12 | 01
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -

QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。