github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/DATAIN.go (about)

     1  //This file is part of EESLISM.
     2  //
     3  //Foobar is free software : you can redistribute itand /or modify
     4  //it under the terms of the GNU General Public License as published by
     5  //the Free Software Foundation, either version 3 of the License, or
     6  //(at your option) any later version.
     7  //
     8  //Foobar is distributed in the hope that it will be useful,
     9  //but WITHOUT ANY WARRANTY; without even the implied warranty of
    10  //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
    11  //GNU General Public License for more details.
    12  //
    13  //You should have received a copy of the GNU General Public License
    14  //along with Foobar.If not, see < https://www.gnu.org/licenses/>.
    15  
    16  package eeslism
    17  
    18  import (
    19  	"fmt"
    20  	"os"
    21  	"strconv"
    22  )
    23  
    24  /*
    25  
    26    入力データの読み込み
    27    FILE=DATAIN.c
    28    Create Date=1999.6.7
    29  */
    30  
    31  func HISASHI(fi *EeTokens, sb *sunblk) {
    32  	sb.snbname = fi.GetToken()
    33  
    34  	// 色の初期値
    35  	sb.rgb[0] = 0.0
    36  	sb.rgb[1] = 0.2
    37  	sb.rgb[2] = 0.0
    38  
    39  	for fi.IsEnd() == false {
    40  		NAME := fi.GetToken()
    41  		if NAME[0] == ';' {
    42  			break
    43  		}
    44  
    45  		if NAME == "-xy" {
    46  			sb.x = fi.GetFloat()
    47  			sb.y = fi.GetFloat()
    48  		} else if NAME == "-DW" {
    49  			sb.D = fi.GetFloat()
    50  			sb.W = fi.GetFloat()
    51  		} else if NAME == "-a" {
    52  			sb.WA = fi.GetFloat()
    53  		} else if NAME == "-rgb" {
    54  			sb.rgb[0] = fi.GetFloat()
    55  			sb.rgb[1] = fi.GetFloat()
    56  			sb.rgb[2] = fi.GetFloat()
    57  		} else {
    58  			fmt.Printf("ERROR parameter----HISASI: %s\n", NAME)
    59  
    60  			os.Exit(1)
    61  		}
    62  	}
    63  }
    64  
    65  /*--------------------------------------------------------------*/
    66  
    67  func BARUKO(fi *EeTokens, sb *sunblk) {
    68  	sb.ref = 0.0
    69  
    70  	sb.rgb[0] = 0.0
    71  	sb.rgb[1] = 0.2
    72  	sb.rgb[2] = 0.0
    73  
    74  	sb.snbname = fi.GetToken()
    75  
    76  	for fi.IsEnd() == false {
    77  		NAME := fi.GetToken()
    78  		if NAME[0] == ';' {
    79  			break
    80  		}
    81  
    82  		if NAME == "-xy" {
    83  			sb.x = fi.GetFloat()
    84  			sb.y = fi.GetFloat()
    85  		} else if NAME == "-DHWh" {
    86  			sb.D = fi.GetFloat()
    87  			sb.H = fi.GetFloat()
    88  			sb.W = fi.GetFloat()
    89  			sb.h = fi.GetFloat()
    90  		} else if NAME == "-ref" {
    91  			sb.ref = fi.GetFloat()
    92  		} else if NAME == "-rgb" {
    93  			sb.rgb[0] = fi.GetFloat()
    94  			sb.rgb[1] = fi.GetFloat()
    95  			sb.rgb[2] = fi.GetFloat()
    96  		} else {
    97  			fmt.Printf("ERROR parameter----WBARUKONI: %s\n", NAME)
    98  
    99  			os.Exit(1)
   100  		}
   101  	}
   102  }
   103  
   104  /*------------------------------------------------------------------*/
   105  
   106  func SODEK(fi *EeTokens, sb *sunblk) {
   107  	sb.rgb[0] = 0.0
   108  	sb.rgb[1] = 0.2
   109  	sb.rgb[2] = 0.0
   110  
   111  	sb.snbname = fi.GetToken()
   112  
   113  	for fi.IsEnd() == false {
   114  		NAME := fi.GetToken()
   115  		if NAME[0] == ';' {
   116  			break
   117  		}
   118  
   119  		if NAME == "-xy" {
   120  			sb.x = fi.GetFloat()
   121  			sb.y = fi.GetFloat()
   122  		} else if NAME == "-DH" {
   123  			sb.D = fi.GetFloat()
   124  			sb.H = fi.GetFloat()
   125  		} else if NAME == "-a" {
   126  			sb.WA = fi.GetFloat()
   127  		} else if NAME == "-rgb" {
   128  			sb.rgb[0] = fi.GetFloat()
   129  			sb.rgb[1] = fi.GetFloat()
   130  			sb.rgb[2] = fi.GetFloat()
   131  		} else {
   132  			fmt.Printf("ERROR parameter----SODEKABE: %s\n", NAME)
   133  
   134  			os.Exit(1)
   135  		}
   136  	}
   137  }
   138  
   139  /*-----------------------------------------------------------------------*/
   140  
   141  func SCREEN(fi *EeTokens, sb *sunblk) {
   142  	sb.rgb[0] = 0.0
   143  	sb.rgb[1] = 0.2
   144  	sb.rgb[2] = 0.0
   145  
   146  	sb.snbname = fi.GetToken()
   147  
   148  	for fi.IsEnd() == false {
   149  		NAME := fi.GetToken()
   150  		if NAME[0] == ';' {
   151  			break
   152  		}
   153  
   154  		if NAME == "-xy" {
   155  			sb.x = fi.GetFloat()
   156  			sb.y = fi.GetFloat()
   157  		} else if NAME == "-DHW" {
   158  			sb.D = fi.GetFloat()
   159  			sb.H = fi.GetFloat()
   160  			sb.W = fi.GetFloat()
   161  		} else if NAME == "-rgb" {
   162  			sb.rgb[0] = fi.GetFloat()
   163  			sb.rgb[1] = fi.GetFloat()
   164  			sb.rgb[2] = fi.GetFloat()
   165  		} else {
   166  			fmt.Printf("ERROR paramater---MADOHIYOKE: %s\n", NAME)
   167  
   168  			os.Exit(1)
   169  		}
   170  	}
   171  }
   172  
   173  /*----------------------------------------------------------------*/
   174  
   175  func rmpdata(fi *EeTokens, rp *RRMP, _wp []MADO) {
   176  	rp.ref = 0.0
   177  	rp.grpx = 1.0
   178  
   179  	rp.rgb[0] = 0.9
   180  	rp.rgb[1] = 0.9
   181  	rp.rgb[2] = 0.9
   182  
   183  	rp.rmpname = fi.GetToken()
   184  	rp.wallname = fi.GetToken()
   185  
   186  	for fi.IsEnd() == false {
   187  		NAME := fi.GetToken()
   188  		if NAME[0] == ';' {
   189  			break
   190  		}
   191  
   192  		if NAME == "-xyb" {
   193  			rp.xb0 = fi.GetFloat()
   194  			rp.yb0 = fi.GetFloat()
   195  		} else if NAME == "-WH" {
   196  			rp.Rw = fi.GetFloat()
   197  			rp.Rh = fi.GetFloat()
   198  		} else if NAME == "-ref" {
   199  			rp.ref = fi.GetFloat()
   200  		} else if NAME == "-grpx" {
   201  			rp.grpx = fi.GetFloat()
   202  		} else if NAME == "-rgb" {
   203  			rp.rgb[0] = fi.GetFloat()
   204  			rp.rgb[1] = fi.GetFloat()
   205  			rp.rgb[2] = fi.GetFloat()
   206  		} else {
   207  			fmt.Printf("ERROR parameter----RMP: %s\n", NAME)
   208  			os.Exit(1)
   209  		}
   210  	}
   211  
   212  	rp.sumWD = 0
   213  	for _, wp := range _wp {
   214  		NAME := fi.GetToken()
   215  		if NAME[0] == ';' {
   216  			break
   217  		}
   218  
   219  		wp.ref = 0.0
   220  		wp.grpx = 1.0
   221  
   222  		wp.rgb[0] = 0.0
   223  		wp.rgb[1] = 0.3
   224  		wp.rgb[2] = 0.8
   225  
   226  		if NAME != "WD" {
   227  			fmt.Printf("ERROR parameter----WD: %s\n", NAME)
   228  			os.Exit(1)
   229  		}
   230  
   231  		rp.sumWD++
   232  
   233  		wp.winname = fi.GetToken()
   234  
   235  		for fi.IsEnd() == false {
   236  			NAME := fi.GetToken()
   237  			if NAME[0] == ';' {
   238  				break
   239  			}
   240  
   241  			if NAME == "-xyr" {
   242  				wp.xr = fi.GetFloat()
   243  				wp.yr = fi.GetFloat()
   244  			} else if NAME == "-WH" {
   245  				wp.Ww = fi.GetFloat()
   246  				wp.Wh = fi.GetFloat()
   247  			} else if NAME == "-ref" {
   248  				wp.ref = fi.GetFloat()
   249  			} else if NAME == "-grpx" {
   250  				wp.grpx = fi.GetFloat()
   251  			} else if NAME == "-rgb" {
   252  				wp.rgb[0] = fi.GetFloat()
   253  				wp.rgb[1] = fi.GetFloat()
   254  				wp.rgb[2] = fi.GetFloat()
   255  			} else {
   256  				fmt.Printf("ERROR parameter----WD: %s\n", NAME)
   257  				os.Exit(1)
   258  			}
   259  		}
   260  	}
   261  }
   262  
   263  /*------------------------------------------------------------------*/
   264  func rectdata(fi *EeTokens, obs *OBS) {
   265  	obs.ref[0] = 0.0
   266  
   267  	obs.rgb[0] = 0.7
   268  	obs.rgb[1] = 0.7
   269  	obs.rgb[2] = 0.7
   270  
   271  	obs.obsname = fi.GetToken()
   272  
   273  	for fi.IsEnd() == false {
   274  		NAME := fi.GetToken()
   275  		if NAME[0] == ';' {
   276  			break
   277  		}
   278  
   279  		if NAME == "-xyz" {
   280  			obs.x = fi.GetFloat()
   281  			obs.y = fi.GetFloat()
   282  			obs.z = fi.GetFloat()
   283  		} else if NAME == "-WH" {
   284  			obs.W = fi.GetFloat()
   285  			obs.H = fi.GetFloat()
   286  		} else if NAME == "-WaWb" {
   287  			obs.Wa = fi.GetFloat()
   288  			obs.Wb = fi.GetFloat()
   289  		} else if NAME == "-ref" {
   290  			obs.ref[0] = fi.GetFloat()
   291  		} else if NAME == "-rgb" {
   292  			obs.rgb[0] = fi.GetFloat()
   293  			obs.rgb[1] = fi.GetFloat()
   294  			obs.rgb[2] = fi.GetFloat()
   295  		} else {
   296  			fmt.Printf("ERROR parameter----OBS.rect: %s\n", NAME)
   297  			os.Exit(1)
   298  		}
   299  	}
   300  }
   301  
   302  /*------------------------------------------------------------------*/
   303  func cubdata(fi *EeTokens, obs *OBS) {
   304  	for i := 0; i < 3; i++ {
   305  		obs.ref[i] = 0.0
   306  	}
   307  
   308  	obs.rgb[0] = 0.7
   309  	obs.rgb[1] = 0.7
   310  	obs.rgb[2] = 0.7
   311  
   312  	obs.obsname = fi.GetToken()
   313  
   314  	for fi.IsEnd() == false {
   315  		NAME := fi.GetToken()
   316  		if NAME[0] == ';' {
   317  			break
   318  		}
   319  
   320  		if NAME == "-xyz" {
   321  			obs.x = fi.GetFloat()
   322  			obs.y = fi.GetFloat()
   323  			obs.z = fi.GetFloat()
   324  		} else if NAME == "-WDH" {
   325  			obs.W = fi.GetFloat()
   326  			obs.D = fi.GetFloat()
   327  			obs.H = fi.GetFloat()
   328  		} else if NAME == "-Wa" {
   329  			obs.Wa = fi.GetFloat()
   330  		} else if NAME == "-ref0" {
   331  			obs.ref[0] = fi.GetFloat()
   332  		} else if NAME == "-ref1" {
   333  			obs.ref[1] = fi.GetFloat()
   334  		} else if NAME == "-ref2" {
   335  			obs.ref[2] = fi.GetFloat()
   336  		} else if NAME == "-ref3" {
   337  			obs.ref[3] = fi.GetFloat()
   338  		} else if NAME == "-rgb" {
   339  			obs.rgb[0] = fi.GetFloat()
   340  			obs.rgb[1] = fi.GetFloat()
   341  			obs.rgb[2] = fi.GetFloat()
   342  		} else {
   343  			fmt.Printf("ERROR parameter----OBS.cube: %s\n", NAME)
   344  			os.Exit(1)
   345  		}
   346  	}
   347  }
   348  
   349  /*-------------------------------------------------------------------*/
   350  func tridata(fi *EeTokens, obs *OBS) {
   351  	obs.ref[0] = 0.0
   352  
   353  	obs.rgb[0] = 0.7
   354  	obs.rgb[1] = 0.7
   355  	obs.rgb[2] = 0.7
   356  
   357  	obs.obsname = fi.GetToken()
   358  
   359  	for fi.IsEnd() == false {
   360  		NAME := fi.GetToken()
   361  		if NAME[0] == ';' {
   362  			break
   363  		}
   364  
   365  		if NAME == "-xyz" {
   366  			obs.x = fi.GetFloat()
   367  			obs.y = fi.GetFloat()
   368  			obs.z = fi.GetFloat()
   369  		} else if NAME == "-WH" {
   370  			obs.W = fi.GetFloat()
   371  			obs.H = fi.GetFloat()
   372  		} else if NAME == "-WaWb" {
   373  			obs.Wa = fi.GetFloat()
   374  			obs.Wb = fi.GetFloat()
   375  		} else if NAME == "-ref" {
   376  			obs.ref[0] = fi.GetFloat()
   377  		} else if NAME == "-rgb" {
   378  			obs.rgb[0] = fi.GetFloat()
   379  			obs.rgb[1] = fi.GetFloat()
   380  			obs.rgb[2] = fi.GetFloat()
   381  		} else {
   382  			fmt.Printf("ERROR parameter----OBS.triangle: %s\n", NAME)
   383  			os.Exit(1)
   384  		}
   385  	}
   386  }
   387  
   388  /*-------------------------------------------------------------------*/
   389  // 20170503 higuchi add
   390  func dividdata(fi *EeTokens, monten *int, DE *float64) {
   391  	var NAME string
   392  
   393  	for fi.IsEnd() == false {
   394  		NAME = fi.GetToken()
   395  		if NAME[0] == ';' {
   396  			break
   397  		}
   398  
   399  		if NAME == "DE" {
   400  			var err error
   401  			s := fi.GetToken()
   402  			*DE, err = strconv.ParseFloat(s, 64)
   403  			if err != nil {
   404  				fmt.Printf("ERROR parameter----DIVID: %s\n", NAME)
   405  			}
   406  		} else if NAME == "MONT" {
   407  			var err error
   408  			s := fi.GetToken()
   409  			*monten, err = strconv.Atoi(s)
   410  			if err != nil {
   411  				fmt.Printf("ERROR parameter----DIVID: %s\n", NAME)
   412  			}
   413  		} else {
   414  			fmt.Printf("ERROR parameter----DIVID: %s\n", NAME)
   415  
   416  			os.Exit(1)
   417  		}
   418  	}
   419  
   420  	NAME = fi.GetToken()
   421  }
   422  
   423  func treedata(fi *EeTokens, treen *int, tree *[]TREE) {
   424  	var i int
   425  	var Ntree int
   426  	var tred *TREE
   427  
   428  	// BDPの数を数える
   429  	Ntree = InputCount(fi, ";")
   430  	fmt.Printf("<treedata> Ntree=%d\n", Ntree)
   431  
   432  	if Ntree > 0 {
   433  		*tree = make([]TREE, Ntree)
   434  
   435  		// 構造体の初期化
   436  		for i = 0; i < Ntree; i++ {
   437  			tred = &(*tree)[i]
   438  
   439  			tred.treename = ""
   440  			tred.treetype = ""
   441  			tred.x = 0.0
   442  			tred.y = 0.0
   443  			tred.z = 0.0
   444  			tred.W1 = 0.0
   445  			tred.W2 = 0.0
   446  			tred.W3 = 0.0
   447  			tred.W4 = 0.0
   448  			tred.H1 = 0.0
   449  			tred.H2 = 0.0
   450  			tred.H3 = 0.0
   451  		}
   452  	}
   453  
   454  	*treen = 0
   455  
   456  	for i = 0; i < Ntree; i++ {
   457  		tred = &(*tree)[i]
   458  
   459  		var NAME string
   460  		NAME = fi.GetToken()
   461  		if NAME[0] == '*' {
   462  			break
   463  		}
   464  
   465  		tred.treetype = NAME
   466  
   467  		NAME = fi.GetToken()
   468  		tred.treename = NAME
   469  
   470  		if tred.treetype == "treeA" {
   471  			for fi.IsEnd() == false {
   472  				NAME = fi.GetToken()
   473  				if NAME[0] == ';' {
   474  					break
   475  				}
   476  
   477  				if NAME == "-xyz" {
   478  					tred.x = fi.GetFloat()
   479  					tred.y = fi.GetFloat()
   480  					tred.z = fi.GetFloat()
   481  				} else if NAME == "-WH1" {
   482  					tred.W1 = fi.GetFloat()
   483  					tred.H1 = fi.GetFloat()
   484  				} else if NAME == "-WH2" {
   485  					tred.W2 = fi.GetFloat()
   486  					tred.H2 = fi.GetFloat()
   487  				} else if NAME == "-WH3" {
   488  					tred.W3 = fi.GetFloat()
   489  					tred.H3 = fi.GetFloat()
   490  				} else if NAME == "-WH4" {
   491  					tred.W4 = fi.GetFloat()
   492  				} else {
   493  					fmt.Printf("ERROR parameter----TREE: %s %s\n", tred.treename, NAME)
   494  					os.Exit(1)
   495  				}
   496  			}
   497  		} else {
   498  			fmt.Printf("ERROR parameter----TREE: %s\n", tred.treetype)
   499  			os.Exit(1)
   500  		}
   501  
   502  		(*treen)++
   503  	}
   504  }
   505  
   506  /*-------------------------*/
   507  func polydata(fi *EeTokens, polyn *int, poly *[]POLYGN) {
   508  	var i int
   509  	var Npoly int
   510  	var polyp *POLYGN
   511  
   512  	// BDPの数を数える
   513  	Npoly = InputCount(fi, ";")
   514  	fmt.Printf("<polydata> Npoly=%d\n", Npoly)
   515  
   516  	if Npoly > 0 {
   517  		*poly = make([]POLYGN, Npoly)
   518  
   519  		// 構造体の初期化
   520  		for i = 0; i < Npoly; i++ {
   521  			polyp = &(*poly)[i]
   522  			polyp.polyknd = ""
   523  			polyp.polyname = ""
   524  			polyp.wallname = ""
   525  			polyp.polyd = 0
   526  			polyp.ref = 0.0
   527  			polyp.refg = 0.0
   528  			polyp.grpx = 0.0
   529  			polyp.P = nil
   530  			matinit(polyp.rgb[:], 3)
   531  		}
   532  	}
   533  
   534  	*polyn = 0
   535  	for i = 0; i < Npoly; i++ {
   536  		polyp = &(*poly)[i]
   537  
   538  		var NAME string
   539  		NAME = fi.GetToken()
   540  		if NAME[0] == '*' {
   541  			break
   542  		}
   543  
   544  		polyp.grpx = 1.0
   545  
   546  		polyp.rgb[0] = 0.9
   547  		polyp.rgb[1] = 0.9
   548  		polyp.rgb[2] = 0.9
   549  
   550  		polyp.polyknd = NAME
   551  
   552  		if polyp.polyknd != "RMP" && polyp.polyknd != "OBS" {
   553  			fmt.Printf("ERROR parameter----POLYGON: %s  <RMP> or <OBS> \n", polyp.polyknd)
   554  			os.Exit(1)
   555  		}
   556  
   557  		polyp.polyd = fi.GetInt()
   558  		polyp.P = make([]XYZ, polyp.polyd)
   559  
   560  		polyp.polyname = fi.GetToken()
   561  		polyp.wallname = fi.GetToken()
   562  
   563  		for fi.IsEnd() == false {
   564  			NAME = fi.GetToken()
   565  			if NAME[0] == ';' {
   566  				break
   567  			}
   568  
   569  			if NAME == "-xyz" {
   570  				for i = 0; i < polyp.polyd; i++ {
   571  					polyp.P[i].X = fi.GetFloat()
   572  					polyp.P[i].Y = fi.GetFloat()
   573  					polyp.P[i].Z = fi.GetFloat()
   574  				}
   575  
   576  			} else if NAME == "-rgb" {
   577  				polyp.rgb[0] = fi.GetFloat()
   578  				polyp.rgb[1] = fi.GetFloat()
   579  				polyp.rgb[2] = fi.GetFloat()
   580  			} else if NAME == "-ref" {
   581  				polyp.ref = fi.GetFloat()
   582  			} else if NAME == "-refg" {
   583  				polyp.refg = fi.GetFloat()
   584  			} else if NAME == "-grpx" {
   585  				polyp.grpx = fi.GetFloat()
   586  			} else {
   587  				fmt.Printf("ERROR parameter----POLYGON: %s\n", NAME)
   588  				os.Exit(1)
   589  			}
   590  		}
   591  		(*polyn)++
   592  	}
   593  }
   594  
   595  /*---------------------------------------------------------------------------*/
   596  func bdpdata(fi *EeTokens, bdpn *int, bp *[]BBDP, Exsf *EXSFS) {
   597  
   598  	var rp *RRMP
   599  	var wp *MADO
   600  	var sb *sunblk
   601  	var Nbdp int
   602  	var bbdp *BBDP
   603  
   604  	// BDPの数を数える
   605  	Nbdp = InputCount(fi, "*")
   606  	//printf("<bdpdata> Nbdp=%d\n", Nbdp)
   607  
   608  	if Nbdp > 0 {
   609  		*bp = make([]BBDP, Nbdp)
   610  		if *bp == nil {
   611  			fmt.Printf("<bdpdata> bpのメモリが確保できません\n")
   612  		}
   613  
   614  		for i := 0; i < Nbdp; i++ {
   615  			bbdp = &(*bp)[i]
   616  			bbdp.bdpname = ""
   617  			bbdp.exh = 0
   618  			bbdp.exw = 0.
   619  			bbdp.sumRMP = 0
   620  			bbdp.sumsblk = 0
   621  			bbdp.x0 = 0
   622  			bbdp.y0 = 0
   623  			bbdp.z0 = 0.
   624  			bbdp.Wa = 0
   625  			bbdp.Wb = 0.
   626  			bbdp.SBLK = nil
   627  			bbdp.RMP = nil
   628  			bbdp.exsfname = ""
   629  		}
   630  	}
   631  
   632  	*bdpn = 0
   633  
   634  	for i := 0; i < Nbdp; i++ {
   635  		bbdp = &(*bp)[i]
   636  
   637  		var NAME string
   638  		NAME = fi.GetToken()
   639  		if NAME[0] == '*' {
   640  			break
   641  		}
   642  
   643  		if NAME != "BDP" {
   644  			fmt.Printf("error BDP\n")
   645  			os.Exit(1)
   646  		}
   647  
   648  		bbdp.bdpname = fi.GetToken()
   649  
   650  		for fi.IsEnd() == false {
   651  			NAME = fi.GetToken()
   652  			if NAME[0] == ';' {
   653  				break
   654  			}
   655  
   656  			if NAME == "-xyz" {
   657  				bbdp.x0 = fi.GetFloat()
   658  				bbdp.y0 = fi.GetFloat()
   659  				bbdp.z0 = fi.GetFloat()
   660  			} else if NAME == "-WA" {
   661  				bbdp.Wa = fi.GetFloat()
   662  			} else if NAME == "-WB" {
   663  				bbdp.Wb = fi.GetFloat()
   664  			} else if NAME == "-WH" {
   665  				bbdp.exw = fi.GetFloat()
   666  				bbdp.exh = fi.GetFloat()
   667  			} else if NAME == "-exs" {
   668  				// Satoh修正(2018/1/23)
   669  				bbdp.exsfname = fi.GetToken()
   670  
   671  				//外表面の検索
   672  				id := false
   673  				for _, Exs := range Exsf.Exs {
   674  					if bbdp.exsfname == Exs.Name {
   675  						bbdp.Wa = Exs.Wa
   676  						bbdp.Wb = Exs.Wb
   677  						id = true
   678  						break
   679  					}
   680  				}
   681  				if id == false {
   682  					fmt.Printf("BDP<%s> %s is not found in EXSRF\n", bbdp.bdpname, bbdp.exsfname)
   683  				}
   684  			} else {
   685  				fmt.Printf("ERROR parameter----BDP %s\n", NAME)
   686  				os.Exit(1)
   687  			}
   688  		}
   689  
   690  		// SBLKの個数を数えてメモリを確保
   691  		Nsblk := SBLKCount(fi)
   692  		if Nsblk > 0 {
   693  			bbdp.SBLK = make([]sunblk, Nsblk)
   694  
   695  			for i := 0; i < Nsblk; i++ {
   696  				sb = &bbdp.SBLK[i]
   697  
   698  				sb.D = 0.0
   699  				sb.H = 0.0
   700  				sb.h = 0.0
   701  				sb.ref = 0.0
   702  				sb.W = 0.0
   703  				sb.WA = 0.0
   704  				sb.x = 0.0
   705  				sb.y = 0.0
   706  				sb.sbfname = ""
   707  				sb.snbname = ""
   708  				matinit(sb.rgb[:], 3)
   709  			}
   710  		}
   711  
   712  		// RMPの個数を数えてメモリを確保
   713  		Nrmp := RMPCount(fi)
   714  		if Nrmp > 0 {
   715  			bbdp.RMP = make([]RRMP, Nrmp)
   716  			for i := 0; i < Nrmp; i++ {
   717  				rp = &bbdp.RMP[i]
   718  				rp.rmpname = ""
   719  				rp.wallname = ""
   720  				rp.sumWD = 0
   721  				rp.ref = 0.0
   722  				rp.xb0 = 0.0
   723  				rp.yb0 = 0.0
   724  				rp.Rw = 0.0
   725  				rp.Rh = 0.0
   726  				rp.grpx = 0.0
   727  				matinit(rp.rgb[:], 3)
   728  				rp.WD = nil
   729  			}
   730  		}
   731  
   732  		// if rp != nil {
   733  		// 	wp = rp.WD
   734  		// }
   735  
   736  		sb_idx := 0
   737  		rp_idx := 0
   738  		for i := 0; i < len(*bp); i++ {
   739  			bbdp = &(*bp)[i]
   740  
   741  			sb = &bbdp.SBLK[sb_idx]
   742  			rp = &bbdp.RMP[rp_idx]
   743  
   744  			NAME = fi.GetToken()
   745  			if NAME[0] == '*' {
   746  				break
   747  			}
   748  
   749  			if NAME == "SBLK" {
   750  				sb.ref = 0.0
   751  				sb.sbfname = fi.GetToken()
   752  
   753  				if sb.sbfname == "HISASI" {
   754  					HISASHI(fi, sb)
   755  				} else if sb.sbfname == "BARUKONI" {
   756  					BARUKO(fi, sb)
   757  				} else if sb.sbfname == "SODEKABE" {
   758  					SODEK(fi, sb)
   759  				} else if sb.sbfname == "MADOHIYOKE" {
   760  					SCREEN(fi, sb)
   761  				} else {
   762  					fmt.Printf("ERROR----\nhiyoke no syurui <HISASI> or <BARUKONI> or <SODEKABE> or <MADOHIYOKE> : %s \n", sb.sbfname)
   763  					os.Exit(1)
   764  				}
   765  
   766  				sb_idx++
   767  				bbdp.sumsblk++
   768  			} else if NAME == "RMP" {
   769  				// WDの数を数えてメモリを確保
   770  				Nwd := WDCount(fi)
   771  
   772  				if Nwd > 0 {
   773  					rp.WD = make([]MADO, Nwd)
   774  					for i := 0; i < Nwd; i++ {
   775  						wp = &rp.WD[i]
   776  						wp.winname = ""
   777  						matinit(wp.rgb[:], 3)
   778  						wp.grpx = 0.0
   779  						wp.ref = 0.0
   780  						wp.Wh = 0.0
   781  						wp.xr = 0.0
   782  						wp.yr = 0.0
   783  					}
   784  				}
   785  				rp.ref = 0.0
   786  				bbdp.sumRMP++
   787  				rmpdata(fi, rp, rp.WD)
   788  
   789  				rp_idx++
   790  			} else {
   791  				fmt.Printf("ERROR----<SBLK> or <RMP> : %s \n", NAME)
   792  				os.Exit(1)
   793  			}
   794  		}
   795  
   796  		(*bdpn)++
   797  	}
   798  }
   799  
   800  /*--------------------------------------------------------------------------*/
   801  func obsdata(fi *EeTokens, obsn *int, obs *[]OBS) {
   802  	var i, Nobs int
   803  	var obsp *OBS
   804  
   805  	// Count the number of OBS entries
   806  	Nobs = InputCount(fi, ";")
   807  	if Nobs > 0 {
   808  		*obs = make([]OBS, Nobs)
   809  		for i = 0; i < Nobs; i++ {
   810  			obsp = &(*obs)[i]
   811  			obsp.fname = ""
   812  			obsp.obsname = ""
   813  			obsp.x = 0.0
   814  			obsp.y = 0.0
   815  			obsp.z = 0.0
   816  			obsp.H = 0.0
   817  			obsp.D = 0.0
   818  			obsp.W = 0.0
   819  			obsp.Wa = 0.0
   820  			obsp.Wb = 0.0
   821  			matinit(obsp.ref[:], 4)
   822  			matinit(obsp.rgb[:], 3)
   823  		}
   824  	}
   825  
   826  	*obsn = 0
   827  	for i = 0; i < Nobs; i++ {
   828  		obsp = &(*obs)[i]
   829  
   830  		NAME := fi.GetToken()
   831  		if NAME[0] == '*' {
   832  			break
   833  		}
   834  
   835  		obsp.fname = NAME
   836  
   837  		for i = 0; i < 4; i++ {
   838  			obsp.ref[i] = 0.0
   839  		}
   840  
   841  		if obsp.fname == "rect" {
   842  			rectdata(fi, obsp)
   843  		} else if obsp.fname == "cube" {
   844  			cubdata(fi, obsp)
   845  		} else if obsp.fname == "r_tri" || obsp.fname == "i_tri" {
   846  			tridata(fi, obsp)
   847  		} else {
   848  			fmt.Printf("ERROR parameter----OBS : %s\n", obsp.fname)
   849  			os.Exit(1)
   850  		}
   851  
   852  		(*obsn)++
   853  	}
   854  }
   855  
   856  func InputCount(fi *EeTokens, key string) int {
   857  	N := 0
   858  	ad := fi.GetPos()
   859  
   860  	for fi.IsEnd() == false {
   861  		s := fi.GetToken()
   862  		if s == "*" {
   863  			break
   864  		}
   865  
   866  		N++
   867  
   868  		for fi.IsEnd() == false {
   869  			s = fi.GetToken()
   870  
   871  			if s == key {
   872  				break
   873  			}
   874  		}
   875  	}
   876  
   877  	fi.RestorePos(ad)
   878  	return N
   879  }
   880  
   881  func SBLKCount(fi *EeTokens) int {
   882  	N := 0
   883  	ad := fi.GetPos()
   884  
   885  	var s string
   886  	for fi.IsEnd() == false {
   887  		s = fi.GetToken()
   888  		if s == "*" {
   889  			break
   890  		}
   891  
   892  		if s == "SBLK" {
   893  			N++
   894  		}
   895  	}
   896  
   897  	fi.RestorePos(ad)
   898  	return N
   899  }
   900  
   901  func RMPCount(fi *EeTokens) int {
   902  	N := 0
   903  	ad := fi.GetPos()
   904  
   905  	var s string
   906  	for fi.IsEnd() == false {
   907  		s = fi.GetToken()
   908  		if s == "*" {
   909  			break
   910  		}
   911  
   912  		if s == "RMP" {
   913  			N++
   914  		}
   915  	}
   916  
   917  	fi.RestorePos(ad)
   918  
   919  	return N
   920  }
   921  
   922  func WDCount(fi *EeTokens) int {
   923  	N := 0
   924  	ad := fi.GetPos()
   925  
   926  	Flg := 0
   927  	for fi.IsEnd() == false {
   928  		s := fi.GetToken()
   929  
   930  		if s == "WD" {
   931  			N++
   932  		}
   933  
   934  		if s == ";" {
   935  			if Flg == 1 {
   936  				break
   937  			} else {
   938  				Flg = 1
   939  			}
   940  		} else {
   941  			Flg = 0
   942  		}
   943  	}
   944  
   945  	fi.RestorePos(ad)
   946  
   947  	return N
   948  }
   949  
   950  func OPcount(Nbdp int, _Bdp []BBDP, Npoly int, _poly []POLYGN) int {
   951  	Nop := 0
   952  
   953  	for i := 0; i < Nbdp; i++ {
   954  		Bdp := &_Bdp[i]
   955  		Nop += Bdp.sumRMP
   956  		for j := 0; j < Bdp.sumRMP; j++ {
   957  			RMP := &Bdp.RMP[i]
   958  			Nop += RMP.sumWD
   959  		}
   960  	}
   961  
   962  	for i := 0; i < Npoly; i++ {
   963  		poly := &_poly[i]
   964  		if poly.polyknd == "RMP" {
   965  			Nop++
   966  		}
   967  	}
   968  
   969  	return Nop
   970  }
   971  
   972  func LPcount(Nbdp int, _Bdp []BBDP, Nobs int, _Obs []OBS, Ntree int, Npoly int, _poly []POLYGN) int {
   973  	Nlp := 0
   974  
   975  	//初期化
   976  	for i := 0; i < Nbdp; i++ {
   977  		Bdp := &_Bdp[i]
   978  		for j := 0; j < Bdp.sumsblk; j++ {
   979  			snbk := &Bdp.SBLK[j]
   980  			if snbk.sbfname == "BARUKONI" {
   981  				Nlp += 5
   982  			} else {
   983  				Nlp++
   984  			}
   985  		}
   986  	}
   987  
   988  	for i := 0; i < Nobs; i++ {
   989  		Obs := &_Obs[i]
   990  		if Obs.fname == "cube" {
   991  			Nlp += 4
   992  		} else {
   993  			Nlp++
   994  		}
   995  	}
   996  
   997  	// 樹木用
   998  	Nlp += Ntree * 20
   999  
  1000  	// ポリゴン
  1001  	for i := 0; i < Npoly; i++ {
  1002  		poly := &_poly[i]
  1003  		if poly.polyknd == "RMP" || poly.polyknd == "OBS" {
  1004  			Nlp++
  1005  		}
  1006  	}
  1007  
  1008  	return Nlp
  1009  }