« 配列複写 | トップページ | 配列複写(曲線属性) »

2018年10月25日 (木)

配列複写(ソリッド図形対応)

配列複写の外部変形、ソリッド図形に対応しました。
※多角形ソリッドは、三角ソリッドと四角ソリッドの組合せです。

@if(0==1) //配列複写(ソリッド図形対応)
@echo off
REM #jww
REM #cd
REM #h1 範囲内のデータのみを選択
REM #hc  図形を範囲選択してください
REM #ht10 ブロック図形除外
REM #ht30 寸法図形除外
REM #c 移動量(X:Y)を入力してください 例)25:35
REM #c 複写数(m:n)を入力してください 例)3:5 
REM #e
echo %1 >temp.txt
echo %2 >>temp.txt
type jwc_temp.txt>>temp.txt
cscript //nologo //e:jscript %0
del temp.txt
goto:eof
@end
//ファイルオープン
fs=new ActiveXObject("Scripting.FileSystemObject")
w=fs.CreateTextFile("jwc_temp.txt")
r=fs.OpenTextFile("temp.txt")
//初期設定
sp=" " //スペース
lmt=50 //複写数Max.
n=0;i=0;j=0
//各データ取得
while (!r.AtEndOfLine) {
data=r.ReadLine()
//移動量取得
if(/:/.test(data)){
dxy=data.split(":")
if(n==0){
dx=dxy[0];dy=dxy[1] //移動量
}else{
nx=dxy[0];ny=dxy[1] //複写数
//複写数制限
if(nx>lmt){nx=lmt}
if(ny>lmt){ny=lmt}
}n=n+1}
else if(/hq/.test(data)){} //"hq"スキップ
//線データ
else if(/^ /.test(data)){
tmp=data.split(/\s+/)
x0=tmp[0];y0=tmp[1];x1=tmp[2];y1=tmp[3]
//xy座標計算
for(i=0;i<nx;i++)for(j=0;j<ny;j++){
xs=parseFloat(x0)+dx*i
ys=parseFloat(y0)+dy*j
xe=parseFloat(x1)+dx*i
ye=parseFloat(y1)+dy*j
topt=[xs,ys,xe,ye]
opt=topt.join(sp)
if(i==0 && j==0){}else{
w.WriteLine(opt)
}}}
//円・点・円ソリッド
else if(/ci|pt|s[ceog]/.test(data)){
tmp=data.split(/\s+/)
x0=tmp[1];y0=tmp[2]
//xy座標計算
for(i=0;i<nx;i++)for(j=0;j<ny;j++){
x=parseFloat(x0)+dx*i
y=parseFloat(y0)+dy*j
tmp.splice(1,2,x,y)
opt=tmp.join(sp)
if(i==0 && j==0){}else{
w.WriteLine(opt)
}}}
//ソリッド図形(線/三角/四角)
else if(/sl/.test(data)){
tmp=data.split(/\s+/)
num=tmp.length
x0=tmp[1];y0=tmp[2];x1=tmp[3];y1=tmp[4]
x2=tmp[5];y2=tmp[6];x3=tmp[7];y3=tmp[8]
for(i=0;i<nx;i++)for(j=0;j<ny;j++){
xa=parseFloat(x0)+dx*i
ya=parseFloat(y0)+dy*j
xb=parseFloat(x1)+dx*i
yb=parseFloat(y1)+dy*j
xc=parseFloat(x2)+dx*i
yc=parseFloat(y2)+dy*j
xd=parseFloat(x3)+dx*i
yd=parseFloat(y3)+dy*j
//線ソリッド
if(num==5){
tmp.splice(1,4,xa,ya,xb,yb)
opt=tmp.join(sp)}
//三角ソリッド
if(num==7){
tmp.splice(1,6,xa,ya,xb,yb,xc,yc)
opt=tmp.join(sp)}
//四角ソリッド
if(num==9){
tmp.splice(1,8,xa,ya,xb,yb,xc,yc,xd,yd)
opt=tmp.join(sp)}
if(i==0 && j==0){}else{
w.WriteLine(opt)
}}}
else{
w.WriteLine(data)
}}
//ファイルクローズ
r.Close();w.Close()
//対象図形:点/線/曲線、円/円弧、楕円/楕円弧
//ソリッド図形:線/三角/四角、円/円周/円環
//2018.10.25 by somem

|

« 配列複写 | トップページ | 配列複写(曲線属性) »

コメント

削除の件、お手数をおかけしました。

気付いた点。
この方法だと、曲線属性の図形を配列複写すると
配列複写された図形の全てが一つの曲線属性となります。
ソリッド図形の曲線属性も同様です。
属性(ハッチ・寸法・図形・建具)も保持できません。

ファイルから読み込んだデータを配列に格納しておき、
各座標値ごとに配列内のデータをループ処理させれば
各々個別の曲線属性になります。
属性も保持できますし、寸法図形にも対応できます。

投稿: 通りすがり | 2018年10月25日 (木) 23時02分

ご指摘いただけるのは、有り難いのですが、
通りすがりさんほどのスキルはありません。
ハードルの高い外変を求められても・・・。
それから、メカ屋の作る外変だということも
ご理解ください。m(_ _)m

投稿: somem | 2018年10月26日 (金) 00時15分

別にスキルの高い話はしていません。
ものすごく単純な話です。
(私のスキルはそんなに高くありません)

r=fs.OpenTextFile("temp.txt")
while (!r.AtEndOfLine) {(ファイル処理)
の中で、
for(i=0;i を使う場合と

for(i=0;i の中で
r=fs.OpenTextFile("temp.txt")
while (!r.AtEndOfLine) {・・・}}
を使う場合

の違いだけです。(ファイル処理とforループの順番の入れ替え)
複写数の数だけファイルのオープン・クローズを繰り返すのは好ましくないのでファイルのデータを配列に格納して利用するという例えが、スキルの高い話だと誤解を与えたのかもしれません。
選択図形にもよりますが20*20までは、ファイルのオープン・クローズを繰り返しても、それほど時間はかからないです。
(ファイルポインタを先頭に戻せればクローズさせなくてよいのですが)

早い話、for(i=0;i 寸法図形にも対応させることができます。
(但し、nxとnyはその前に取得する。)

投稿: 通りすがり | 2018年10月26日 (金) 15時45分

for文の部分は書き込み禁止のようですね。
欠けてしまっているので意味が伝わらないかも。

ようするに、iとnxのfor文とjとnyのfor文の中に
ファイルのオープン・処理・クローズを入れてしまう
ということなのですが。

投稿: 通りすがり | 2018年10月26日 (金) 15時56分

>for文の部分は書き込み禁止のようですね。

禁止の設定は、何もしていませんが。

>iとnxのfor文とjとnyのfor文の中に
ファイルのオープン・処理・クローズを入れてしまう

貴殿にとっては、簡単なことであっても、
私には、理解できないです。
For文で処理できるとしても、複数要素の曲線属性の場合は、
i,j以外に、もう一つカウンタが必要な気がします。
いずれにしても、少し自分で考えないと答えは出ません。

投稿: somem | 2018年10月26日 (金) 20時40分

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 配列複写(ソリッド図形対応):

« 配列複写 | トップページ | 配列複写(曲線属性) »