Compare commits

...

6 Commits

Author SHA1 Message Date
6cd2abe560 .NET Framework 4.8 업그레이드 및 WebView2 통합
- 모든 프로젝트를 .NET Framework 4.0 → 4.8로 업그레이드
- WebView2 NuGet 패키지 추가 (v1.0.3537.50)
- 사용자 매뉴얼 폼 추가 (Frm_WebManual)
  * WebView2 컨트롤 통합
  * localhost:58123 자동 로드
  * MDI 메인 메뉴에 Manual 항목 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-10 15:37:23 +09:00
0eaeeb0aac add webhosting 2025-10-04 22:13:51 +09:00
ykh
370a838f42 ... 2025-09-29 23:34:43 +09:00
ykh
52a7c0f1f7 형별성능내역 삭제 오류 해결
대지외 신재생 계산 오류 해결
순생산량, 총소요량 문구 수정
2025-08-01 00:02:46 +09:00
ykh
c6bc4676d3 * 연료전지 오류 수정 2025-07-29 21:26:38 +09:00
ykh
cf277012bc 파일을 열고 무조건 열관류율탭 자동 업데이트 적용 2025-07-11 00:01:25 +09:00
49 changed files with 7412 additions and 4919 deletions

View File

@@ -13,7 +13,7 @@
<AssemblyName>ArinLog.Net4</AssemblyName>
<FileAlignment>512</FileAlignment>
<MyType>Windows</MyType>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>

View File

@@ -15,7 +15,7 @@
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<OldToolsVersion>3.5</OldToolsVersion>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">

View File

@@ -15,7 +15,7 @@
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<OldToolsVersion>3.5</OldToolsVersion>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">

View File

@@ -17,6 +17,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utility", "Utility\Utility.
EndProject
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "Setup1", "Setup1\Setup1.vdproj", "{0E52FBAC-1A86-4722-93D0-CA7B8570B617}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A01A7396-C1BE-4D13-8B51-C9C1830DA088}"
ProjectSection(SolutionItems) = preProject
CLAUDE.md = CLAUDE.md
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
CD_ROM|Any CPU = CD_ROM|Any CPU

View File

@@ -1451,11 +1451,11 @@
Public Overridable Sub Calc_HeatingSystem(ByVal i_count_month As Integer, ByVal theta_e As Decimal)
pLog.Add(String.Format("Enter >> Calc_HeatingSystem i_count_month={0},theta_e={1}", i_count_month, theta_e))
d_op_max_mth = 0
'==================================2010.2.21 수정
'For Each DRpriod As DS.tbl_DescRow In DSET.tbl_Desc.Select("cname<>'0'", "cname")
' priod_value = CSng(DRpriod.priod)
'Next
@@ -1535,7 +1535,7 @@
'//130822
Dim 보일러정격출력합 As Decimal = 0 '//acc
For Each Dr난방 As DS.tbl_nanbangkikiRow In DSET.tbl_nanbangkiki.Select("code<>'0' and 헤더적용=true", "code")
'=======================================================================================================2014.02.24 수정
@@ -2581,6 +2581,11 @@
t_w_100 = Q_w_outg_i / (Q_dot_N * d_Nutz_mth) '(3.2.9-61)
Q_dot_d_in = Q_h_outg_i / (d_h_rB * (t_h_rL_T - t_w_100)) '(3.2.7-69) 난방 또는 난방 및 급탕
' 우선 미적용 Q_dot_d_in = sigma_Q_h_outg / (t_Betrieb_K - t_W_100) * d_Nutz_mth '(3.2.7-70) 난방, 급탕 및 공조
If Q_dot_d_in <= 0 Then '2025.08.22 추가
t_w_100 = 0
Q_dot_d_in = 0
End If
End If
@@ -2701,6 +2706,14 @@
Q_h_g = Q_h_g + (Q_h_g_v_i * d_h_rB) * system_count '=====2013.08.13 수정 '(3.2.7-66)
Q_h_g_i = Q_h_g_v_i * d_h_rB
'If Q_h_g_i < 0 Then
' Console.WriteLine("minus")
'End If
Else
If dr난방.열생산기기방식 = "지역난방" Then ' Worksheets("난방기기").Range("열생산기기방식1").Offset(0, i_count_boiler - 1) = "지역난방" Then
@@ -2846,11 +2859,13 @@
If d_Nutz_mth = 0 Then '//201.11.20 추가(학교프로파일 적용시 문제점 해결)
t_w_100 = 0
Else
t_w_100 = Q_w_outg / (Q_dot_N * d_Nutz_mth)
t_w_100 = Q_w_outg_i / (Q_dot_N * d_Nutz_mth) '2025.08.19 Q_w_outg 를 Q_w_outg_i 로 수정
End If
Q_h_g_aux = Q_h_g_aux + (P_h_g_aux * (t_h_rL - t_w_100 * d_op_max_mth * d_Nutz_a / 365) + P_aux_SB * (24 * d_op_max_mth - t_h_rL)) * system_count '=====2013.08.18 수정 '(3.2.7-80)
'If Q_h_g_aux < 0 Then
' Console.WriteLine("minus")
'End If
End If
@@ -3598,7 +3613,7 @@
End If '===========================================================2014.03.07 추가
'======================================================================================================================================================2010.04.23 추가
Q_h_outg = Q_h_outg + Q_h_outg_i * system_count '=====2013.08.13 수정 '===================================================2013.01.16 추가
@@ -3716,6 +3731,11 @@
t_w_100 = Q_w_outg_i / (Q_dot_N * d_Nutz_mth) '(3.2.9-61)
Q_dot_d_in = Q_h_outg_i / (d_h_rB * (t_h_rL_T - t_w_100)) '(3.2.7-69) 난방 또는 난방 및 급탕
' 우선 미적용 Q_dot_d_in = sigma_Q_h_outg / (t_Betrieb_K - t_W_100) * d_Nutz_mth '(3.2.7-70) 난방, 급탕 및 공조
If Q_dot_d_in <= 0 Then '2025.08.22 수정
t_w_100 = 0
Q_dot_d_in = 0
End If
End If
@@ -3836,6 +3856,14 @@
Q_h_g = Q_h_g + (Q_h_g_v_i * d_h_rB) * system_count '=====2013.08.13 수정 '(3.2.7-66)
Q_h_g_i = Q_h_g_v_i * d_h_rB
'If Q_h_g_i < 0 Then
' Console.WriteLine("minus")
'End If
Else
If dr난방.열생산기기방식 = "지역난방" Then ' Worksheets("난방기기").Range("열생산기기방식1").Offset(0, i_count_boiler - 1) = "지역난방" Then
@@ -3981,15 +4009,18 @@
If d_Nutz_mth = 0 Then '//201.11.20 추가(학교프로파일 적용시 문제점 해결)
t_w_100 = 0
Else
If system_count = 0 Then
t_w_100 = Q_w_outg_i / (Q_dot_N * d_Nutz_mth)
Else
t_w_100 = (Q_w_outg_i) / (Q_dot_N * d_Nutz_mth) '//2011.12.04 수정
End If
'If system_count = 0 Then
' t_w_100 = Q_w_outg_i / (Q_dot_N * d_Nutz_mth)
'Else
t_w_100 = (Q_w_outg_i) / (Q_dot_N * d_Nutz_mth) '//2011.12.04 수정
'End If
End If
Q_h_g_aux = Q_h_g_aux + (P_h_g_aux * (t_h_rL - t_w_100 * d_op_max_mth * d_Nutz_a / 365) + P_aux_SB * (24 * d_op_max_mth - t_h_rL)) * system_count '=====2013.08.18 수정 '(3.2.7-80)
'If Q_h_g_aux < 0 Then
' Console.WriteLine("minus")
'End If
End If

View File

@@ -498,11 +498,8 @@
P_pk = K_pk * a
If Dr신재생.대지외설치여부 Then
E_el_pv_out_offsite = E_el_pv_out_offsite + E_sol * P_pk * f_perf
E_el_pv_out_offsite += E_sol * P_pk * f_perf
Else
E_el_pv_out += E_sol * P_pk * f_perf
End If
@@ -908,7 +905,7 @@
E_chp_gen_in = Q_chp_gen_out / (eta_T_chp_an / 100)
E_el_chp_out = E_chp_gen_in * eta_el_chp_an / 100
Result.생산E(i_chp_month).열병합전력생산량 += E_el_chp_out
'//전기생산량 열병합
If Dr신재생.열병합신재생여부 Then
@@ -981,11 +978,11 @@
pLog.Add(String.Format("Calc_CogenerationSystemEN 결과3 신재생면적당열생산량={0}", Result.생산E(i_chp_month).신재생면적당열생산량))
Else
Result.생산E(i_chp_month).열병합전력생산량 += E_el_chp_out '// 20241229 추가
'Else
' Result.생산E(i_chp_month).열병합전력생산량 += E_el_chp_out '// 20241229 추가
pLog.Add(String.Format("Calc_CogenerationSystemEN 결과0 E_chp_gen_in={0},E_el_chp_out={1}", E_chp_gen_in, E_el_chp_out))
pLog.Add(String.Format("Calc_CogenerationSystemEN 결과1 열병합전력생산량={0}", Result.생산E(i_chp_month).열병합전력생산량))
' pLog.Add(String.Format("Calc_CogenerationSystemEN 결과0 E_chp_gen_in={0},E_el_chp_out={1}", E_chp_gen_in, E_el_chp_out))
' pLog.Add(String.Format("Calc_CogenerationSystemEN 결과1 열병합전력생산량={0}", Result.생산E(i_chp_month).열병합전력생산량))
End If
'DSETR.TReqUse.Rows(77)("M" & Format(i_chp_month, "00")) = CSng(DSETR.TReqUse.Rows(77)("M" & Format(i_chp_month, "00"))) + E_el_chp_out ' Sheets("계산결과").Cells(96, 7 + i_chp_month) = E_el_chp_out

View File

@@ -1,4 +1,12 @@
Partial Class DS
Partial Class tbl_ykDataTable
Private Sub tbl_ykDataTable_tbl_ykRowChanging(sender As System.Object, e As tbl_ykRowChangeEvent) Handles Me.tbl_ykRowChanging
End Sub
End Class
Partial Class tbl_profileDataTable
End Class

View File

@@ -29,7 +29,7 @@
<OldToolsVersion>3.5</OldToolsVersion>
<ApplicationManifest>My Project\app.manifest</ApplicationManifest>
<ApplicationIcon>002.ico</ApplicationIcon>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<TargetFrameworkProfile />
<PublishUrl>ftp://tindevil.com/www/mynetapp/t4/</PublishUrl>
<Install>true</Install>
@@ -51,6 +51,8 @@
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -111,8 +113,41 @@
<SpecificVersion>False</SpecificVersion>
<HintPath>..\Interop.VBIDE.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Owin, Version=2.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\lib\Microsoft.Owin.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Owin.FileSystems, Version=2.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\lib\Microsoft.Owin.FileSystems.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Owin.Host.HttpListener, Version=2.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\lib\Microsoft.Owin.Host.HttpListener.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Owin.Hosting, Version=2.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\lib\Microsoft.Owin.Hosting.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Owin.StaticFiles, Version=2.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\lib\Microsoft.Owin.StaticFiles.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ReportViewer.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<Reference Include="Microsoft.ReportViewer.WinForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="Microsoft.Web.WebView2.Core, Version=1.0.3537.50, Culture=neutral, PublicKeyToken=2a8ab48044d2601e, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Web.WebView2.1.0.3537.50\lib\net462\Microsoft.Web.WebView2.Core.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.WebView2.WinForms, Version=1.0.3537.50, Culture=neutral, PublicKeyToken=2a8ab48044d2601e, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Web.WebView2.1.0.3537.50\lib\net462\Microsoft.Web.WebView2.WinForms.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.WebView2.Wpf, Version=1.0.3537.50, Culture=neutral, PublicKeyToken=2a8ab48044d2601e, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Web.WebView2.1.0.3537.50\lib\net462\Microsoft.Web.WebView2.Wpf.dll</HintPath>
</Reference>
<Reference Include="Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\lib\Owin.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Data.DataSetExtensions" />
@@ -173,6 +208,12 @@
<Compile Include="Forms_Basic\frm_batch.vb">
<SubType>Form</SubType>
</Compile>
<Compile Include="Forms_Basic\Frm_WebManual.Designer.vb">
<DependentUpon>Frm_WebManual.vb</DependentUpon>
</Compile>
<Compile Include="Forms_Basic\Frm_WebManual.vb">
<SubType>Form</SubType>
</Compile>
<Compile Include="Forms_Basic\fSelectWeatherGroup.Designer.vb">
<DependentUpon>fSelectWeatherGroup.vb</DependentUpon>
</Compile>
@@ -209,6 +250,12 @@
<Compile Include="Forms_Report\Frm_Macro.vb">
<SubType>Form</SubType>
</Compile>
<Compile Include="Forms_Report\Frm_Macro2.Designer.vb">
<DependentUpon>Frm_Macro2.vb</DependentUpon>
</Compile>
<Compile Include="Forms_Report\Frm_Macro2.vb">
<SubType>Form</SubType>
</Compile>
<Compile Include="Forms_Report\Frm_Upload.Designer.vb">
<DependentUpon>Frm_Upload.vb</DependentUpon>
</Compile>
@@ -477,6 +524,9 @@
<Compile Include="Forms_Basic\Frm_FileInfo.vb">
<SubType>Form</SubType>
</Compile>
<Compile Include="WebServer\Example_WebServer_Usage.vb" />
<Compile Include="WebServer\Startup.vb" />
<Compile Include="WebServer\StaticFileServer.vb" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Forms_Basic\Frm_DisplayGubun.resx">
@@ -491,6 +541,9 @@
<EmbeddedResource Include="Forms_Basic\frm_batch.resx">
<DependentUpon>frm_batch.vb</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms_Basic\Frm_WebManual.resx">
<DependentUpon>Frm_WebManual.vb</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms_Basic\Frm_Work.resx">
<DependentUpon>Frm_Work.vb</DependentUpon>
<SubType>Designer</SubType>
@@ -515,6 +568,9 @@
<EmbeddedResource Include="Forms_Report\Frm_Macro.resx">
<DependentUpon>Frm_Macro.vb</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms_Report\Frm_Macro2.resx">
<DependentUpon>Frm_Macro2.vb</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms_Report\Frm_Upload.resx">
<DependentUpon>Frm_Upload.vb</DependentUpon>
</EmbeddedResource>
@@ -693,6 +749,7 @@
</None>
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
<None Include="Resources\user_24.png" />
</ItemGroup>
<ItemGroup>
@@ -780,6 +837,7 @@
<Content Include="icon5.ico" />
<None Include="Resources\select_by_difference.png" />
<None Include="Resources\page_copy.png" />
<Content Include="WebServer\INSTALL.txt" />
<Content Include="단축키.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -798,6 +856,7 @@
<Content Include="Forms_Input\ReadMe.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<None Include="WebServer\README.md" />
<None Include="방위2.png" />
<None Include="방위.png" />
<None Include="방위.jpg" />
@@ -848,6 +907,13 @@
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildBinPath)\Microsoft.VisualBasic.targets" />
<Import Project="..\packages\Microsoft.Web.WebView2.1.0.3537.50\build\Microsoft.Web.WebView2.targets" Condition="Exists('..\packages\Microsoft.Web.WebView2.1.0.3537.50\build\Microsoft.Web.WebView2.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>이 프로젝트는 이 컴퓨터에 없는 NuGet 패키지를 참조합니다. 해당 패키지를 다운로드하려면 NuGet 패키지 복원을 사용하십시오. 자세한 내용은 http://go.microsoft.com/fwlink/?LinkID=322105를 참조하십시오. 누락된 파일은 {0}입니다.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Microsoft.Web.WebView2.1.0.3537.50\build\Microsoft.Web.WebView2.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Web.WebView2.1.0.3537.50\build\Microsoft.Web.WebView2.targets'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">

View File

@@ -0,0 +1,56 @@
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Frm_WebManual
Inherits System.Windows.Forms.Form
'Form은 Dispose를 재정의하여 구성 요소 목록을 정리합니다.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Windows Form 디자이너에 필요합니다.
Private components As System.ComponentModel.IContainer
'참고: 다음 프로시저는 Windows Form 디자이너에 필요합니다.
'수정하려면 Windows Form 디자이너를 사용하십시오.
'코드 편집기에서는 수정하지 마세요.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.WebView21 = New Microsoft.Web.WebView2.WinForms.WebView2()
CType(Me.WebView21, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'WebView21
'
Me.WebView21.AllowExternalDrop = True
Me.WebView21.CreationProperties = Nothing
Me.WebView21.DefaultBackgroundColor = System.Drawing.Color.White
Me.WebView21.Dock = System.Windows.Forms.DockStyle.Fill
Me.WebView21.Location = New System.Drawing.Point(0, 0)
Me.WebView21.Name = "WebView21"
Me.WebView21.Size = New System.Drawing.Size(1350, 700)
Me.WebView21.TabIndex = 0
Me.WebView21.ZoomFactor = 1.0R
'
'Frm_WebManual
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(7.0!, 12.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(1350, 700)
Me.Controls.Add(Me.WebView21)
Me.Name = "Frm_WebManual"
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
Me.Text = "사용자 매뉴얼"
CType(Me.WebView21, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
End Sub
Friend WithEvents WebView21 As Microsoft.Web.WebView2.WinForms.WebView2
End Class

View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,29 @@
Public Class Frm_WebManual
Public Sub Navigate(url As String)
Try
If WebView21 IsNot Nothing AndAlso WebView21.CoreWebView2 IsNot Nothing Then
WebView21.CoreWebView2.Navigate(url)
End If
Catch ex As Exception
MessageBox.Show("웹페이지 이동 중 오류가 발생했습니다: " & ex.Message,
"오류", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
Private Async Sub Frm_WebManual_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try
' WebView2 초기화
Await WebView21.EnsureCoreWebView2Async(Nothing)
' 로컬 웹서버 페이지 로드
WebView21.CoreWebView2.Navigate("http://localhost:58123/")
Catch ex As Exception
MessageBox.Show("웹페이지 로드 중 오류가 발생했습니다: " & ex.Message, _
"오류", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
End Class

View File

@@ -70,16 +70,6 @@ Partial Class Frm_YK
Me.cmb_재료 = New System.Windows.Forms.ComboBox()
Me.Panel1 = New System.Windows.Forms.Panel()
Me.arindv1 = New System.Windows.Forms.DataGridView()
Me.bn_detail = New System.Windows.Forms.BindingNavigator(Me.components)
Me.ToolStripLabel1 = New System.Windows.Forms.ToolStripLabel()
Me.btj_add = New System.Windows.Forms.ToolStripButton()
Me.btj_del = New System.Windows.Forms.ToolStripButton()
Me.ToolStripSeparator2 = New System.Windows.Forms.ToolStripSeparator()
Me.ToolStripLabel2 = New System.Windows.Forms.ToolStripLabel()
Me.btj_showimg = New System.Windows.Forms.ToolStripButton()
Me.cmb_형태 = New Eco2Ar.MyCmb()
Me.bs_gubun = New System.Windows.Forms.BindingSource(Me.components)
Me.bS_재료 = New System.Windows.Forms.BindingSource(Me.components)
Me.커스텀 = New System.Windows.Forms.DataGridViewTextBoxColumn()
Me.code = New System.Windows.Forms.DataGridViewTextBoxColumn()
Me.재료명 = New System.Windows.Forms.DataGridViewTextBoxColumn()
@@ -91,6 +81,16 @@ Partial Class Frm_YK
Me.열저항 = New System.Windows.Forms.DataGridViewTextBoxColumn()
Me.전경 = New System.Windows.Forms.DataGridViewButtonColumn()
Me.Column1 = New System.Windows.Forms.DataGridViewButtonColumn()
Me.bn_detail = New System.Windows.Forms.BindingNavigator(Me.components)
Me.ToolStripLabel1 = New System.Windows.Forms.ToolStripLabel()
Me.btj_add = New System.Windows.Forms.ToolStripButton()
Me.btj_del = New System.Windows.Forms.ToolStripButton()
Me.ToolStripSeparator2 = New System.Windows.Forms.ToolStripSeparator()
Me.ToolStripLabel2 = New System.Windows.Forms.ToolStripLabel()
Me.btj_showimg = New System.Windows.Forms.ToolStripButton()
Me.cmb_형태 = New Eco2Ar.MyCmb()
Me.bs_gubun = New System.Windows.Forms.BindingSource(Me.components)
Me.bS_재료 = New System.Windows.Forms.BindingSource(Me.components)
CType(Me.SplitContainer1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SplitContainer1.Panel1.SuspendLayout()
Me.SplitContainer1.Panel2.SuspendLayout()
@@ -591,97 +591,6 @@ Partial Class Frm_YK
Me.arindv1.Size = New System.Drawing.Size(427, 326)
Me.arindv1.TabIndex = 157
'
'bn_detail
'
Me.bn_detail.AddNewItem = Nothing
Me.bn_detail.AutoSize = False
Me.bn_detail.BindingSource = Me.bs_detail
Me.bn_detail.CountItem = Me.ToolStripLabel1
Me.bn_detail.DeleteItem = Nothing
Me.bn_detail.Dock = System.Windows.Forms.DockStyle.Bottom
Me.bn_detail.Font = New System.Drawing.Font("돋움", 8.999999!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(129, Byte))
Me.bn_detail.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden
Me.bn_detail.ImageScalingSize = New System.Drawing.Size(20, 20)
Me.bn_detail.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.btj_add, Me.btj_del, Me.ToolStripSeparator2, Me.ToolStripLabel2, Me.ToolStripLabel1, Me.btj_showimg})
Me.bn_detail.Location = New System.Drawing.Point(0, 326)
Me.bn_detail.MoveFirstItem = Nothing
Me.bn_detail.MoveLastItem = Nothing
Me.bn_detail.MoveNextItem = Nothing
Me.bn_detail.MovePreviousItem = Nothing
Me.bn_detail.Name = "bn_detail"
Me.bn_detail.PositionItem = Me.ToolStripLabel2
Me.bn_detail.Size = New System.Drawing.Size(427, 40)
Me.bn_detail.TabIndex = 2
Me.bn_detail.Text = "BindingNavigator1"
'
'ToolStripLabel1
'
Me.ToolStripLabel1.Name = "ToolStripLabel1"
Me.ToolStripLabel1.Size = New System.Drawing.Size(33, 37)
Me.ToolStripLabel1.Text = "/{0}"
'
'btj_add
'
Me.btj_add.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image
Me.btj_add.Image = Global.Eco2Ar.My.Resources.Resources.new_32
Me.btj_add.Name = "btj_add"
Me.btj_add.RightToLeftAutoMirrorImage = True
Me.btj_add.Size = New System.Drawing.Size(24, 37)
Me.btj_add.Text = "신규추가(&A)"
Me.btj_add.ToolTipText = "새로운 프로필을 추가합니다"
'
'btj_del
'
Me.btj_del.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image
Me.btj_del.Image = Global.Eco2Ar.My.Resources.Resources.remov_32
Me.btj_del.Name = "btj_del"
Me.btj_del.RightToLeftAutoMirrorImage = True
Me.btj_del.Size = New System.Drawing.Size(24, 37)
Me.btj_del.Text = "선택삭제(&D)"
Me.btj_del.ToolTipText = "선택된 프로필을 삭제합니다"
'
'ToolStripSeparator2
'
Me.ToolStripSeparator2.Name = "ToolStripSeparator2"
Me.ToolStripSeparator2.Size = New System.Drawing.Size(6, 40)
'
'ToolStripLabel2
'
Me.ToolStripLabel2.Name = "ToolStripLabel2"
Me.ToolStripLabel2.Size = New System.Drawing.Size(12, 37)
Me.ToolStripLabel2.Text = "0"
'
'btj_showimg
'
Me.btj_showimg.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right
Me.btj_showimg.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text
Me.btj_showimg.Image = CType(resources.GetObject("btj_showimg.Image"), System.Drawing.Image)
Me.btj_showimg.ImageTransparentColor = System.Drawing.Color.Magenta
Me.btj_showimg.Name = "btj_showimg"
Me.btj_showimg.Size = New System.Drawing.Size(87, 37)
Me.btj_showimg.Text = "구분그림보기"
Me.btj_showimg.Visible = False
'
'cmb_형태
'
Me.cmb_형태.DropDownStyle = System.Windows.Forms.ComboBoxStyle.Simple
Me.cmb_형태.FormattingEnabled = True
Me.cmb_형태.Location = New System.Drawing.Point(22, 225)
Me.cmb_형태.Name = "cmb_형태"
Me.cmb_형태.NectControl = Nothing
Me.cmb_형태.Size = New System.Drawing.Size(152, 204)
Me.cmb_형태.TabIndex = 131
'
'bs_gubun
'
Me.bs_gubun.DataMember = "tbl_common"
Me.bs_gubun.DataSource = Me.DS
'
'bS_재료
'
Me.bS_재료.DataMember = "tbl_common"
Me.bS_재료.DataSource = Me.DS
'
'커스텀
'
Me.커스텀.DataPropertyName = "커스텀"
@@ -791,6 +700,97 @@ Partial Class Frm_YK
Me.Column1.Visible = False
Me.Column1.Width = 35
'
'bn_detail
'
Me.bn_detail.AddNewItem = Nothing
Me.bn_detail.AutoSize = False
Me.bn_detail.BindingSource = Me.bs_detail
Me.bn_detail.CountItem = Me.ToolStripLabel1
Me.bn_detail.DeleteItem = Nothing
Me.bn_detail.Dock = System.Windows.Forms.DockStyle.Bottom
Me.bn_detail.Font = New System.Drawing.Font("돋움", 8.999999!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(129, Byte))
Me.bn_detail.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden
Me.bn_detail.ImageScalingSize = New System.Drawing.Size(20, 20)
Me.bn_detail.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.btj_add, Me.btj_del, Me.ToolStripSeparator2, Me.ToolStripLabel2, Me.ToolStripLabel1, Me.btj_showimg})
Me.bn_detail.Location = New System.Drawing.Point(0, 326)
Me.bn_detail.MoveFirstItem = Nothing
Me.bn_detail.MoveLastItem = Nothing
Me.bn_detail.MoveNextItem = Nothing
Me.bn_detail.MovePreviousItem = Nothing
Me.bn_detail.Name = "bn_detail"
Me.bn_detail.PositionItem = Me.ToolStripLabel2
Me.bn_detail.Size = New System.Drawing.Size(427, 40)
Me.bn_detail.TabIndex = 2
Me.bn_detail.Text = "BindingNavigator1"
'
'ToolStripLabel1
'
Me.ToolStripLabel1.Name = "ToolStripLabel1"
Me.ToolStripLabel1.Size = New System.Drawing.Size(33, 37)
Me.ToolStripLabel1.Text = "/{0}"
'
'btj_add
'
Me.btj_add.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image
Me.btj_add.Image = Global.Eco2Ar.My.Resources.Resources.new_32
Me.btj_add.Name = "btj_add"
Me.btj_add.RightToLeftAutoMirrorImage = True
Me.btj_add.Size = New System.Drawing.Size(24, 37)
Me.btj_add.Text = "신규추가(&A)"
Me.btj_add.ToolTipText = "새로운 프로필을 추가합니다"
'
'btj_del
'
Me.btj_del.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image
Me.btj_del.Image = Global.Eco2Ar.My.Resources.Resources.remov_32
Me.btj_del.Name = "btj_del"
Me.btj_del.RightToLeftAutoMirrorImage = True
Me.btj_del.Size = New System.Drawing.Size(24, 37)
Me.btj_del.Text = "선택삭제(&D)"
Me.btj_del.ToolTipText = "선택된 프로필을 삭제합니다"
'
'ToolStripSeparator2
'
Me.ToolStripSeparator2.Name = "ToolStripSeparator2"
Me.ToolStripSeparator2.Size = New System.Drawing.Size(6, 40)
'
'ToolStripLabel2
'
Me.ToolStripLabel2.Name = "ToolStripLabel2"
Me.ToolStripLabel2.Size = New System.Drawing.Size(12, 37)
Me.ToolStripLabel2.Text = "0"
'
'btj_showimg
'
Me.btj_showimg.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right
Me.btj_showimg.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text
Me.btj_showimg.Image = CType(resources.GetObject("btj_showimg.Image"), System.Drawing.Image)
Me.btj_showimg.ImageTransparentColor = System.Drawing.Color.Magenta
Me.btj_showimg.Name = "btj_showimg"
Me.btj_showimg.Size = New System.Drawing.Size(87, 37)
Me.btj_showimg.Text = "구분그림보기"
Me.btj_showimg.Visible = False
'
'cmb_형태
'
Me.cmb_형태.DropDownStyle = System.Windows.Forms.ComboBoxStyle.Simple
Me.cmb_형태.FormattingEnabled = True
Me.cmb_형태.Location = New System.Drawing.Point(22, 225)
Me.cmb_형태.Name = "cmb_형태"
Me.cmb_형태.NectControl = Nothing
Me.cmb_형태.Size = New System.Drawing.Size(152, 204)
Me.cmb_형태.TabIndex = 131
'
'bs_gubun
'
Me.bs_gubun.DataMember = "tbl_common"
Me.bs_gubun.DataSource = Me.DS
'
'bS_재료
'
Me.bS_재료.DataMember = "tbl_common"
Me.bS_재료.DataSource = Me.DS
'
'Frm_YK
'
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None

View File

@@ -27,14 +27,16 @@
'// 입력면데이터중에 열관류율을 사용한 데이터 업데이트(131009)
For Each dr As DS.tbl_myounRow In DSET1.tbl_myoun.Select("열관류율2 <> '0'")
If dr.RowState = DataRowState.Deleted Then Continue For
Dim ykcode As String = dr.열관류율2
Dim ykrow() As DS.tbl_ykRow = DSET1.tbl_yk.Select("code='" + ykcode + "'")
If ykrow.Length = 1 Then
dr.투과율 = ykrow(0).투과율
End If
dr.AcceptChanges()
dr.EndEdit()
Next
BaseDT.AcceptChanges()
BaseDS.AcceptChanges()
Update_열관류율_140409()
Return True
@@ -89,58 +91,9 @@
Me.arindv1.EndEdit()
Me.bs.EndEdit()
'//열관류율이 링크된 모든면의 건축부위 데이터를 열관류율 화면의 건축부위 데이터로 갱신
For Each Drow As DS.tbl_myounRow In DSET1.tbl_myoun
Pub.Update_열관류율_140409()
If Drow.RowState = DataRowState.Deleted OrElse Drow.RowState = DataRowState.Detached Then Continue For
#If DEBUG Then
If Drow.code = "0009" Then
MsgBox("test")
End If
#End If
If Drow.열관류율2 <> "0" Then
Try '==========================================2014.04.17 열관류율 삭제시 코드번호가 남아 오류 발생하는 현상을 try 안으로 넣음
Dim Dr As DS.tbl_ykRow = DSET1.tbl_yk.Select("code='" & Drow.열관류율2.ToString & "'")(0)
Drow.건축부위방식 = Dr.면형태 '// 링크된 열관류율에서 면형태를 가져옴..
Select Case Dr.면형태
Case "외벽(벽체)", "0"
Drow.건축부위방식 = "외벽"
Case "외벽(지붕)", "0001"
Drow.건축부위방식 = "외벽"
'Drow.방위 = "수평"
Case "외벽(바닥)", "0002"
Drow.건축부위방식 = "외벽"
'Drow.방위 = "일사없음"
Case "내벽(벽체)", "0003", "지중벽", "0009"
Drow.건축부위방식 = "내벽"
Drow.방위 = "일사없음"
Case "내벽(지붕)", "0004"
Drow.건축부위방식 = "내벽"
Drow.방위 = "일사없음"
Case "내벽(바닥)", "0005"
Drow.건축부위방식 = "내벽"
Drow.방위 = "일사없음"
Case "간벽", "0006"
Drow.건축부위방식 = "간벽"
Drow.방위 = "일사없음"
Case "외부창", "0007"
Drow.건축부위방식 = "외부창"
'Drow.투과율 = Dr.일사에너지투과율
Case "내부창", "0008"
Drow.건축부위방식 = "내부창"
'Drow.투과율 = Dr.일사에너지투과율
Case Else
MsgBox("모르는값 " & Dr("면형태").ToString & "/" & Dr.면형태)
End Select
Catch ex As Exception
End Try
End If
Next
End Sub
@@ -952,6 +905,7 @@
Next
End If
Me.bs.RemoveCurrent()
Me.bs.EndEdit()
End Sub

View File

@@ -180,190 +180,190 @@
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="PictureBox1.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
/9j/4AAQSkZJRgABAgEASABIAAD/7gAOQWRvYmUAZAAAAAAB/+ED5kV4aWYAAE1NACoAAAAIAAcBEgAD
AAAAAQABAAABGgAFAAAAAQAAAGIBGwAFAAAAAQAAAGoBKAADAAAAAQACAAABMQACAAAAHAAAAHIBMgAC
AAAAFAAAAI6HaQAEAAAAAQAAAKIAAADCAEgAAAABAAAASAAAAAEAAEFkb2JlIFBob3Rvc2hvcCBDUzMg
V2luZG93cwAyMDEwOjA0OjE1IDIwOjMyOjA0AAACoAIABAAAAAEAAAA8oAMABAAAAAEAAAAMAAAAAAAA
AAYBAwADAAAAAQAGAAABGgAFAAAAAQAAARABGwAFAAAAAQAAARgBKAADAAAAAQACAAACAQAEAAAAAQAA
ASACAgAEAAAAAQAAAr4AAAAAAAAASAAAAAEAAABIAAAAAf/Y/+AAEEpGSUYAAQIAAEgASAAA/+0ADEFk
b2JlX0NNAAH/7gAOQWRvYmUAZIAAAAAB/9sAhAAMCAgICQgMCQkMEQsKCxEVDwwMDxUYExMVExMYEQwM
DAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0LCw0ODRAODhAUDg4OFBQODg4OFBEMDAwM
DBERDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAAMADwDASIAAhEBAxEB/90A
BAAE/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQFBgcICQoLAQABBQEBAQEBAQAAAAAAAAABAAIDBAUG
BwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhEDBCESMQVBUWETInGBMgYUkaGxQiMkFVLBYjM0coLRQwcl
klPw4fFjczUWorKDJkSTVGRFwqN0NhfSVeJl8rOEw9N14/NGJ5SkhbSVxNTk9KW1xdXl9VZmdoaWprbG
1ub2N0dXZ3eHl6e3x9fn9xEAAgIBAgQEAwQFBgcHBgU1AQACEQMhMRIEQVFhcSITBTKBkRShsUIjwVLR
8DMkYuFygpJDUxVjczTxJQYWorKDByY1wtJEk1SjF2RFVTZ0ZeLys4TD03Xj80aUpIW0lcTU5PSltcXV
5fVWZnaGlqa2xtbm9ic3R1dnd4eXp7fH/9oADAMBAAIRAxEAPwDd/amR/pH/AOcf70v2pkf6R/8AnH+9
UUlofq/Bpevxb37UyP8ASP8A84/3pftTI/0j/wDOP96opJfq/BXr8W9+1Mj/AEj/APOP96X7UyP9I/8A
zj/eqKSX6vwV6/F3ujdbuGS2i5xfU8HVxktIG76XyW99vo27p0XGdO2/ba930dZj+q5dX+qfZPL8VAeD
341VVr/eZhx+0bu708n/2f/iDFhJQ0NfUFJPRklMRQABAQAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfO
AAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rl
c2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJY
WVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1
bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJU
UkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55
AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4x
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA
81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAA
YpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVj
LmNoAAAAAAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0Ig
Y29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29s
b3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2Ug
Vmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdp
bmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAA
AAAAE6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAA
AAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAU
ABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACp
AK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFS
AVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJB
AksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+
A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUN
BRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1
BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6
CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvh
C/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7u
DwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJk
EoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJ
FmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqe
GsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9p
H5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSr
JNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpo
KpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCk
MNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdg
N5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6g
PuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZn
RqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63
TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeS
V+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8
YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3
a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWF
deF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4Co
gQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/Ixj
jMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4
mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWp
phqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4
s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFn
wePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA5
0LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v
4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M
8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23////b
AEMAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAwMD
AwMDAwMDA//bAEMBAQEBAQEBAQEBAQICAQICAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
AwMDAwMDAwMDAwMDAwMDA//AABEIAAwAPAMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQID
BAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR
8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOE
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp
6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUE
BAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3
ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeo
qaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/
AP1ZH7UPxEAA/wCEw8bnj/ob9f8A/k+v7U/1Nyj/AKF+G/8ABUP/AJE/llcSZlZf7dX/APBk/wDMX/hq
H4if9Df43/8ACv1//wCT6P8AU3Kf+hfhv/BUP/kQ/wBZcy/6Dq//AIMn/mH/AA1D8RP+hv8AG/8A4V+v
/wDyfR/qblP/AEL8N/4Kh/8AIh/rLmX/AEHV/wDwZP8AzD/hqH4if9Df43/8K/X/AP5Po/1Nyn/oX4b/
AMFQ/wDkQ/1lzL/oOr/+DJ/5h/w1D8RP+hv8b/8AhX6//wDJ9H+puU/9C/Df+Cof/Ih/rLmX/QdX/wDB
k/8AMT/hqH4if9Df43/8K/X/AP5Po/1Nyn/oX4b/AMFQ/wDkQ/1kzL/oOr/+DJ/5n2R+xz+234zt/iRp
nw+8a6vqXiDwZ4gs9baObXr+bUr/AMPajpmkX2tQ3FlqV2Zb57K7XT2t3tXkaJWkV4whVxJ+beJfAuU4
Th/FZ/hKEKOMw8qd+SKjGcZzjTs4q0bpyUlJK7s073VvuuBOLMxxGcYfJ8TWlVw1ZTtzu7hKMJTupPWz
UWnFu2qatrf9aP8AhfXgv+zv7U89/sfm+V5207N+M43fSv50P2w/kwr/AEFP42CgAoAKACgAoA9s/Z0/
s7/hcng3+1vP/s7Ov/avs2PP2f8ACL63t2buP9ZjP+zmvz7xU/5IPPf+4H/qRRPsvD//AJK7KP8AuL/6
ZqH7/wD/ABaT/hUfb7Ht/wBj7V9p8v8A9Cr+Oz+lz//Z
/9j/4AAQSkZJRgABAgEASABIAAD/4QPmRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAAB
AAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAcAAAAcgEyAAIAAAAUAAAAjodpAAQAAAAB
AAAAogAAAMIASAAAAAEAAABIAAAAAQAAQWRvYmUgUGhvdG9zaG9wIENTMyBXaW5kb3dzADIwMTA6MDQ6
MTUgMjA6MzI6MDQAAAKgAgAEAAAAAQAAADygAwAEAAAAAQAAAAwAAAAAAAAABgEDAAMAAAABAAYAAAEa
AAUAAAABAAABEAEbAAUAAAABAAABGAEoAAMAAAABAAIAAAIBAAQAAAABAAABIAICAAQAAAABAAACvgAA
AAAAAABIAAAAAQAAAEgAAAAB/9j/4AAQSkZJRgABAgAASABIAAD/7QAMQWRvYmVfQ00AAf/uAA5BZG9i
ZQBkgAAAAAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwMDAwMDAwM
DAwMDAwMDAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwM
DAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAAwAPAMBIgACEQEDEQH/3QAEAAT/xAE/AAABBQEBAQEB
AQAAAAAAAAADAAECBAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIEAgUH
BggFAwwzAQACEQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRygtFDByWSU/Dh8WNzNRaisoMmRJNU
ZEXCo3Q2F9JV4mXys4TD03Xj80YnlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3
EQACAgECBAQDBAUGBwcGBTUBAAIRAyExEgRBUWFxIhMFMoGRFKGxQiPBUtHwMyRi4XKCkkNTFWNzNPEl
BhaisoMHJjXC0kSTVKMXZEVVNnRl4vKzhMPTdePzRpSkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2JzdH
V2d3h5ent8f/2gAMAwEAAhEDEQA/AN39qZH+kf8A5x/vS/amR/pH/wCcf71RSWh+r8Gl6/FvftTI/wBI
/wDzj/el+1Mj/SP/AM4/3qikl+r8Fevxb37UyP8ASP8A84/3pftTI/0j/wDOP96opJfq/BXr8Xe6N1u4
ZLaLnF9TwdXGS0gbvpfJb32+jbunRcZ07b9tr3fR1mP6rl1f6p9k8vxUB4PfjVVWv95mHH7Ru7vTyf/Z
/+IMWElDQ19QUk9GSUxFAAEBAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1T
RlQAAAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAA
AfAAAAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAA
AlQAAABwZG1kZAAAAsQAAACIdnVlZAAAA0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAA
BAwAAAAkdGVjaAAABDAAAAAMclRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAA
AABDb3B5cmlnaHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNS
R0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAA
AAAAAAAAAAAAAAAAAABYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAA
AAAAACSgAAAPhAAAts9kZXNjAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJ
RUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBz
UkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdC
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlv
biBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4g
SUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD
7cwABBMLAANcngAAAAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAA
AAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7
AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQ
ANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGL
AZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKO
ApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPg
A+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWG
BZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeG
B5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnl
CfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgyn
DMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/P
D+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNj
E4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdl
F4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshva
HAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDE
IPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYn
Jlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwF
LDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJj
Mpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlC
OX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECm
QOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iR
SNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EG
UVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoH
WlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OX
Y+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25
bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhu
eMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6
hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+e
kAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wc
nImc951kndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3
qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbw
t2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVL
xcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ
1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr
5HPk/OWE5g3mlucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q0
9ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf///9sAQwABAQEBAQEBAQEBAQEB
AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgIDAwMDAwMDAwMD/9sAQwEBAQEB
AQEBAQEBAgIBAgIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
/8AAEQgADAA8AwERAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIB
AwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYn
KCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqi
o6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8B
AAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYS
QVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZX
WFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG
x8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/VkftQ/EQAD/AITDxueP
+hv1/wD+T6/tT/U3KP8AoX4b/wAFQ/8AkT+WVxJmVl/t1f8A8GT/AMxf+GofiJ/0N/jf/wAK/X//AJPo
/wBTcp/6F+G/8FQ/+RD/AFlzL/oOr/8Agyf+Yf8ADUPxE/6G/wAb/wDhX6//APJ9H+puU/8AQvw3/gqH
/wAiH+suZf8AQdX/APBk/wDMP+GofiJ/0N/jf/wr9f8A/k+j/U3Kf+hfhv8AwVD/AORD/WXMv+g6v/4M
n/mH/DUPxE/6G/xv/wCFfr//AMn0f6m5T/0L8N/4Kh/8iH+suZf9B1f/AMGT/wAxP+GofiJ/0N/jf/wr
9f8A/k+j/U3Kf+hfhv8AwVD/AORD/WTMv+g6v/4Mn/mfZH7HP7bfjO3+JGmfD7xrq+peIPBniCz1to5t
ev5tSv8Aw9qOmaRfa1DcWWpXZlvnsrtdPa3e1eRolaRXjCFXEn5t4l8C5ThOH8Vn+EoQo4zDyp35IqMZ
xnONOzirRunJSUkruzTvdW+64E4szHEZxh8nxNaVXDVlO3O7uEowlO6k9bNRacW7apq2t/1o/wCF9eC/
7O/tTz3+x+b5XnbTs34zjd9K/nQ/bD+TCv8AQU/jYKACgAoAKACgD2z9nT+zv+FyeDf7W8/+zs6/9q+z
Y8/Z/wAIvre3Zu4/1mM/7Oa/PvFT/kg89/7gf+pFE+y8P/8Akrso/wC4v/pmofv/AP8AFpP+FR9vse3/
AGPtX2ny/wD0Kv47P6XP/9k=
</value>
</data>
<data name="PictureBox4.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
/9j/4AAQSkZJRgABAgEASABIAAD/7gAOQWRvYmUAZAAAAAAB/+ED5kV4aWYAAE1NACoAAAAIAAcBEgAD
AAAAAQABAAABGgAFAAAAAQAAAGIBGwAFAAAAAQAAAGoBKAADAAAAAQACAAABMQACAAAAHAAAAHIBMgAC
AAAAFAAAAI6HaQAEAAAAAQAAAKIAAADCAEgAAAABAAAASAAAAAEAAEFkb2JlIFBob3Rvc2hvcCBDUzMg
V2luZG93cwAyMDEwOjA0OjE1IDIwOjMyOjA0AAACoAIABAAAAAEAAAA8oAMABAAAAAEAAAAMAAAAAAAA
AAYBAwADAAAAAQAGAAABGgAFAAAAAQAAARABGwAFAAAAAQAAARgBKAADAAAAAQACAAACAQAEAAAAAQAA
ASACAgAEAAAAAQAAAr4AAAAAAAAASAAAAAEAAABIAAAAAf/Y/+AAEEpGSUYAAQIAAEgASAAA/+0ADEFk
b2JlX0NNAAH/7gAOQWRvYmUAZIAAAAAB/9sAhAAMCAgICQgMCQkMEQsKCxEVDwwMDxUYExMVExMYEQwM
DAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0LCw0ODRAODhAUDg4OFBQODg4OFBEMDAwM
DBERDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAAMADwDASIAAhEBAxEB/90A
BAAE/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQFBgcICQoLAQABBQEBAQEBAQAAAAAAAAABAAIDBAUG
BwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhEDBCESMQVBUWETInGBMgYUkaGxQiMkFVLBYjM0coLRQwcl
klPw4fFjczUWorKDJkSTVGRFwqN0NhfSVeJl8rOEw9N14/NGJ5SkhbSVxNTk9KW1xdXl9VZmdoaWprbG
1ub2N0dXZ3eHl6e3x9fn9xEAAgIBAgQEAwQFBgcHBgU1AQACEQMhMRIEQVFhcSITBTKBkRShsUIjwVLR
8DMkYuFygpJDUxVjczTxJQYWorKDByY1wtJEk1SjF2RFVTZ0ZeLys4TD03Xj80aUpIW0lcTU5PSltcXV
5fVWZnaGlqa2xtbm9ic3R1dnd4eXp7fH/9oADAMBAAIRAxEAPwDd/amR/pH/AOcf70v2pkf6R/8AnH+9
UUlofq/Bpevxb37UyP8ASP8A84/3pftTI/0j/wDOP96opJfq/BXr8W9+1Mj/AEj/APOP96X7UyP9I/8A
zj/eqKSX6vwV6/F3ujdbuGS2i5xfU8HVxktIG76XyW99vo27p0XGdO2/ba930dZj+q5dX+qfZPL8VAeD
341VVr/eZhx+0bu708n/2f/iDFhJQ0NfUFJPRklMRQABAQAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfO
AAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rl
c2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJY
WVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1
bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJU
UkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55
AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4x
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA
81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAA
YpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVj
LmNoAAAAAAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0Ig
Y29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29s
b3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2Ug
Vmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdp
bmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAA
AAAAE6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAA
AAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAU
ABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACp
AK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFS
AVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJB
AksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+
A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUN
BRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1
BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6
CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvh
C/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7u
DwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJk
EoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJ
FmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqe
GsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9p
H5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSr
JNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpo
KpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCk
MNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdg
N5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6g
PuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZn
RqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63
TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeS
V+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8
YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3
a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWF
deF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4Co
gQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/Ixj
jMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4
mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWp
phqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4
s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFn
wePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA5
0LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v
4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M
8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23////b
AEMAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAwMD
AwMDAwMDA//bAEMBAQEBAQEBAQEBAQICAQICAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
AwMDAwMDAwMDAwMDAwMDA//AABEIAAwAPAMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQID
BAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR
8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOE
hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp
6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUE
BAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3
ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeo
qaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/
AP1ZH7UPxEAA/wCEw8bnj/ob9f8A/k+v7U/1Nyj/AKF+G/8ABUP/AJE/llcSZlZf7dX/APBk/wDMX/hq
H4if9Df43/8ACv1//wCT6P8AU3Kf+hfhv/BUP/kQ/wBZcy/6Dq//AIMn/mH/AA1D8RP+hv8AG/8A4V+v
/wDyfR/qblP/AEL8N/4Kh/8AIh/rLmX/AEHV/wDwZP8AzD/hqH4if9Df43/8K/X/AP5Po/1Nyn/oX4b/
AMFQ/wDkQ/1lzL/oOr/+DJ/5h/w1D8RP+hv8b/8AhX6//wDJ9H+puU/9C/Df+Cof/Ih/rLmX/QdX/wDB
k/8AMT/hqH4if9Df43/8K/X/AP5Po/1Nyn/oX4b/AMFQ/wDkQ/1kzL/oOr/+DJ/5n2R+xz+234zt/iRp
nw+8a6vqXiDwZ4gs9baObXr+bUr/AMPajpmkX2tQ3FlqV2Zb57K7XT2t3tXkaJWkV4whVxJ+beJfAuU4
Th/FZ/hKEKOMw8qd+SKjGcZzjTs4q0bpyUlJK7s073VvuuBOLMxxGcYfJ8TWlVw1ZTtzu7hKMJTupPWz
UWnFu2qatrf9aP8AhfXgv+zv7U89/sfm+V5207N+M43fSv50P2w/kwr/AEFP42CgAoAKACgAoA9s/Z0/
s7/hcng3+1vP/s7Ov/avs2PP2f8ACL63t2buP9ZjP+zmvz7xU/5IPPf+4H/qRRPsvD//AJK7KP8AuL/6
ZqH7/wD/ABaT/hUfb7Ht/wBj7V9p8v8A9Cr+Oz+lz//Z
/9j/4AAQSkZJRgABAgEASABIAAD/4QPmRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAAB
AAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAcAAAAcgEyAAIAAAAUAAAAjodpAAQAAAAB
AAAAogAAAMIASAAAAAEAAABIAAAAAQAAQWRvYmUgUGhvdG9zaG9wIENTMyBXaW5kb3dzADIwMTA6MDQ6
MTUgMjA6MzI6MDQAAAKgAgAEAAAAAQAAADygAwAEAAAAAQAAAAwAAAAAAAAABgEDAAMAAAABAAYAAAEa
AAUAAAABAAABEAEbAAUAAAABAAABGAEoAAMAAAABAAIAAAIBAAQAAAABAAABIAICAAQAAAABAAACvgAA
AAAAAABIAAAAAQAAAEgAAAAB/9j/4AAQSkZJRgABAgAASABIAAD/7QAMQWRvYmVfQ00AAf/uAA5BZG9i
ZQBkgAAAAAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwMDAwMDAwM
DAwMDAwMDAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwM
DAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAAwAPAMBIgACEQEDEQH/3QAEAAT/xAE/AAABBQEBAQEB
AQAAAAAAAAADAAECBAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIEAgUH
BggFAwwzAQACEQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRygtFDByWSU/Dh8WNzNRaisoMmRJNU
ZEXCo3Q2F9JV4mXys4TD03Xj80YnlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3
EQACAgECBAQDBAUGBwcGBTUBAAIRAyExEgRBUWFxIhMFMoGRFKGxQiPBUtHwMyRi4XKCkkNTFWNzNPEl
BhaisoMHJjXC0kSTVKMXZEVVNnRl4vKzhMPTdePzRpSkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2JzdH
V2d3h5ent8f/2gAMAwEAAhEDEQA/AN39qZH+kf8A5x/vS/amR/pH/wCcf71RSWh+r8Gl6/FvftTI/wBI
/wDzj/el+1Mj/SP/AM4/3qikl+r8Fevxb37UyP8ASP8A84/3pftTI/0j/wDOP96opJfq/BXr8Xe6N1u4
ZLaLnF9TwdXGS0gbvpfJb32+jbunRcZ07b9tr3fR1mP6rl1f6p9k8vxUB4PfjVVWv95mHH7Ru7vTyf/Z
/+IMWElDQ19QUk9GSUxFAAEBAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1T
RlQAAAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAA
AfAAAAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAA
AlQAAABwZG1kZAAAAsQAAACIdnVlZAAAA0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAA
BAwAAAAkdGVjaAAABDAAAAAMclRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAA
AABDb3B5cmlnaHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNS
R0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAA
AAAAAAAAAAAAAAAAAABYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAA
AAAAACSgAAAPhAAAts9kZXNjAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJ
RUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBz
UkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdC
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlv
biBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4g
SUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD
7cwABBMLAANcngAAAAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAA
AAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7
AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQ
ANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGL
AZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKO
ApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPg
A+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWG
BZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeG
B5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnl
CfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgyn
DMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/P
D+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNj
E4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdl
F4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshva
HAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDE
IPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYn
Jlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwF
LDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJj
Mpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlC
OX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECm
QOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iR
SNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EG
UVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoH
WlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OX
Y+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25
bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhu
eMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6
hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+e
kAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wc
nImc951kndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3
qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbw
t2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVL
xcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ
1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr
5HPk/OWE5g3mlucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q0
9ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf///9sAQwABAQEBAQEBAQEBAQEB
AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgIDAwMDAwMDAwMD/9sAQwEBAQEB
AQEBAQEBAgIBAgIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD
/8AAEQgADAA8AwERAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIB
AwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYn
KCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqi
o6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8B
AAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYS
QVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZX
WFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG
x8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/VkftQ/EQAD/AITDxueP
+hv1/wD+T6/tT/U3KP8AoX4b/wAFQ/8AkT+WVxJmVl/t1f8A8GT/AMxf+GofiJ/0N/jf/wAK/X//AJPo
/wBTcp/6F+G/8FQ/+RD/AFlzL/oOr/8Agyf+Yf8ADUPxE/6G/wAb/wDhX6//APJ9H+puU/8AQvw3/gqH
/wAiH+suZf8AQdX/APBk/wDMP+GofiJ/0N/jf/wr9f8A/k+j/U3Kf+hfhv8AwVD/AORD/WXMv+g6v/4M
n/mH/DUPxE/6G/xv/wCFfr//AMn0f6m5T/0L8N/4Kh/8iH+suZf9B1f/AMGT/wAxP+GofiJ/0N/jf/wr
9f8A/k+j/U3Kf+hfhv8AwVD/AORD/WTMv+g6v/4Mn/mfZH7HP7bfjO3+JGmfD7xrq+peIPBniCz1to5t
ev5tSv8Aw9qOmaRfa1DcWWpXZlvnsrtdPa3e1eRolaRXjCFXEn5t4l8C5ThOH8Vn+EoQo4zDyp35IqMZ
xnONOzirRunJSUkruzTvdW+64E4szHEZxh8nxNaVXDVlO3O7uEowlO6k9bNRacW7apq2t/1o/wCF9eC/
7O/tTz3+x+b5XnbTs34zjd9K/nQ/bD+TCv8AQU/jYKACgAoAKACgD2z9nT+zv+FyeDf7W8/+zs6/9q+z
Y8/Z/wAIvre3Zu4/1mM/7Oa/PvFT/kg89/7gf+pFE+y8P/8Akrso/wC4v/pmofv/AP8AFpP+FR9vse3/
AGPtX2ny/wD0Kv47P6XP/9k=
</value>
</data>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">

View File

@@ -1115,6 +1115,10 @@
Me.cmb_건축부위방식.Enabled = False
' MsgBox(Me.cmb_열관류율.SelectedValue)
'//아래와동일한 코드 pub Update_열관류율_140409() 에 있음
'//변경시 같이 변경해야함 250710-2320
Try
Dim Dr As DS.tbl_ykRow = DSET1.tbl_yk.Select("code='" & Me.cmb_열관류율.SelectedValue & "'")(0)
Dim dr2() As DS.tbl_commonRow = DSET1.tbl_common.Select("gubun='1088' and code='" & Dr("면형태").ToString & "'")

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,220 @@
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Frm_Macro2
Inherits System.Windows.Forms.Form
'Form은 Dispose를 재정의하여 구성 요소 목록을 정리합니다.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Windows Form 디자이너에 필요합니다.
Private components As System.ComponentModel.IContainer
'참고: 다음 프로시저는 Windows Form 디자이너에 필요합니다.
'수정하려면 Windows Form 디자이너를 사용하십시오.
'코드 편집기를 사용하여 수정하지 마십시오.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Dim DefaultFocusIndicatorRenderer1 As FarPoint.Win.Spread.DefaultFocusIndicatorRenderer = New FarPoint.Win.Spread.DefaultFocusIndicatorRenderer()
Dim DefaultScrollBarRenderer1 As FarPoint.Win.Spread.DefaultScrollBarRenderer = New FarPoint.Win.Spread.DefaultScrollBarRenderer()
Dim DefaultScrollBarRenderer2 As FarPoint.Win.Spread.DefaultScrollBarRenderer = New FarPoint.Win.Spread.DefaultScrollBarRenderer()
Me.FpSpread1 = New FarPoint.Win.Spread.FpSpread()
Me.FpSpread1_Sheet1 = New FarPoint.Win.Spread.SheetView()
Me.Button2 = New System.Windows.Forms.Button()
Me.Button1 = New System.Windows.Forms.Button()
Me.tbStart = New System.Windows.Forms.TextBox()
Me.Button3 = New System.Windows.Forms.Button()
Me.ProgressBar1 = New System.Windows.Forms.ProgressBar()
Me.Label1 = New System.Windows.Forms.Label()
Me.tbEnd = New System.Windows.Forms.TextBox()
Me.TableLayoutPanel1 = New System.Windows.Forms.TableLayoutPanel()
Me.Label2 = New System.Windows.Forms.Label()
CType(Me.FpSpread1, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.FpSpread1_Sheet1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.TableLayoutPanel1.SuspendLayout()
Me.SuspendLayout()
'
'FpSpread1
'
Me.FpSpread1.AccessibleDescription = ""
Me.FpSpread1.Dock = System.Windows.Forms.DockStyle.Fill
Me.FpSpread1.FocusRenderer = DefaultFocusIndicatorRenderer1
Me.FpSpread1.HorizontalScrollBar.Buttons = New FarPoint.Win.Spread.FpScrollBarButtonCollection("BackwardLineButton,ThumbTrack,ForwardLineButton")
Me.FpSpread1.HorizontalScrollBar.Name = ""
Me.FpSpread1.HorizontalScrollBar.Renderer = DefaultScrollBarRenderer1
Me.FpSpread1.HorizontalScrollBar.TabIndex = 2
Me.FpSpread1.Location = New System.Drawing.Point(0, 38)
Me.FpSpread1.Name = "FpSpread1"
Me.FpSpread1.Sheets.AddRange(New FarPoint.Win.Spread.SheetView() {Me.FpSpread1_Sheet1})
Me.FpSpread1.Size = New System.Drawing.Size(1019, 453)
Me.FpSpread1.Skin = FarPoint.Win.Spread.DefaultSpreadSkins.Classic
Me.FpSpread1.TabIndex = 0
Me.FpSpread1.VerticalScrollBar.Buttons = New FarPoint.Win.Spread.FpScrollBarButtonCollection("BackwardLineButton,ThumbTrack,ForwardLineButton")
Me.FpSpread1.VerticalScrollBar.Name = ""
Me.FpSpread1.VerticalScrollBar.Renderer = DefaultScrollBarRenderer2
Me.FpSpread1.VerticalScrollBar.TabIndex = 3
Me.FpSpread1.VisualStyles = FarPoint.Win.VisualStyles.Off
'
'FpSpread1_Sheet1
'
Me.FpSpread1_Sheet1.Reset()
Me.FpSpread1_Sheet1.SheetName = "Sheet1"
'Formulas and custom names must be loaded with R1C1 reference style
Me.FpSpread1_Sheet1.ReferenceStyle = FarPoint.Win.Spread.Model.ReferenceStyle.R1C1
FpSpread1_Sheet1.ColumnCount = 5
FpSpread1_Sheet1.RowCount = 1
Me.FpSpread1_Sheet1.ColumnFooter.DefaultStyle.NoteIndicatorColor = System.Drawing.Color.Red
Me.FpSpread1_Sheet1.ColumnFooter.DefaultStyle.Parent = "HeaderDefault"
Me.FpSpread1_Sheet1.ColumnFooterSheetCornerStyle.NoteIndicatorColor = System.Drawing.Color.Red
Me.FpSpread1_Sheet1.ColumnFooterSheetCornerStyle.Parent = "CornerDefault"
Me.FpSpread1_Sheet1.ColumnHeader.DefaultStyle.NoteIndicatorColor = System.Drawing.Color.Red
Me.FpSpread1_Sheet1.ColumnHeader.DefaultStyle.Parent = "HeaderDefault"
Me.FpSpread1_Sheet1.RowHeader.DefaultStyle.NoteIndicatorColor = System.Drawing.Color.Red
Me.FpSpread1_Sheet1.RowHeader.DefaultStyle.Parent = "RowHeaderDefault"
Me.FpSpread1_Sheet1.SheetCornerStyle.NoteIndicatorColor = System.Drawing.Color.Red
Me.FpSpread1_Sheet1.SheetCornerStyle.Parent = "CornerDefault"
Me.FpSpread1_Sheet1.ReferenceStyle = FarPoint.Win.Spread.Model.ReferenceStyle.A1
'
'Button2
'
Me.Button2.Dock = System.Windows.Forms.DockStyle.Fill
Me.Button2.Location = New System.Drawing.Point(673, 3)
Me.Button2.Name = "Button2"
Me.Button2.Size = New System.Drawing.Size(194, 32)
Me.Button2.TabIndex = 1
Me.Button2.Text = "결과저장하기"
Me.Button2.UseVisualStyleBackColor = True
'
'Button1
'
Me.Button1.Dock = System.Windows.Forms.DockStyle.Fill
Me.Button1.Location = New System.Drawing.Point(3, 3)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(194, 32)
Me.Button1.TabIndex = 0
Me.Button1.Text = "목록불러오기"
Me.Button1.UseVisualStyleBackColor = True
'
'tbStart
'
Me.tbStart.Dock = System.Windows.Forms.DockStyle.Fill
Me.tbStart.Font = New System.Drawing.Font("맑은 고딕", 14.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(129, Byte))
Me.tbStart.Location = New System.Drawing.Point(283, 3)
Me.tbStart.Name = "tbStart"
Me.tbStart.Size = New System.Drawing.Size(74, 33)
Me.tbStart.TabIndex = 2
Me.tbStart.Text = "6"
Me.tbStart.TextAlign = System.Windows.Forms.HorizontalAlignment.Center
'
'Button3
'
Me.Button3.Dock = System.Windows.Forms.DockStyle.Fill
Me.Button3.Location = New System.Drawing.Point(523, 3)
Me.Button3.Name = "Button3"
Me.Button3.Size = New System.Drawing.Size(144, 32)
Me.Button3.TabIndex = 3
Me.Button3.Text = "실행"
Me.Button3.UseVisualStyleBackColor = True
'
'ProgressBar1
'
Me.ProgressBar1.Dock = System.Windows.Forms.DockStyle.Bottom
Me.ProgressBar1.Location = New System.Drawing.Point(0, 491)
Me.ProgressBar1.Name = "ProgressBar1"
Me.ProgressBar1.Size = New System.Drawing.Size(1019, 23)
Me.ProgressBar1.TabIndex = 2
'
'Label1
'
Me.Label1.Dock = System.Windows.Forms.DockStyle.Fill
Me.Label1.Location = New System.Drawing.Point(363, 0)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(74, 38)
Me.Label1.TabIndex = 3
Me.Label1.Text = "~"
Me.Label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
'
'tbEnd
'
Me.tbEnd.Dock = System.Windows.Forms.DockStyle.Fill
Me.tbEnd.Font = New System.Drawing.Font("맑은 고딕", 14.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(129, Byte))
Me.tbEnd.Location = New System.Drawing.Point(443, 3)
Me.tbEnd.Name = "tbEnd"
Me.tbEnd.Size = New System.Drawing.Size(74, 33)
Me.tbEnd.TabIndex = 4
Me.tbEnd.Text = "0"
Me.tbEnd.TextAlign = System.Windows.Forms.HorizontalAlignment.Center
'
'TableLayoutPanel1
'
Me.TableLayoutPanel1.ColumnCount = 8
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 200.0!))
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 80.0!))
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 80.0!))
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 80.0!))
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 80.0!))
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 150.0!))
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 200.0!))
Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
Me.TableLayoutPanel1.Controls.Add(Me.Button1, 0, 0)
Me.TableLayoutPanel1.Controls.Add(Me.Button3, 5, 0)
Me.TableLayoutPanel1.Controls.Add(Me.Button2, 6, 0)
Me.TableLayoutPanel1.Controls.Add(Me.tbEnd, 4, 0)
Me.TableLayoutPanel1.Controls.Add(Me.Label2, 1, 0)
Me.TableLayoutPanel1.Controls.Add(Me.tbStart, 2, 0)
Me.TableLayoutPanel1.Controls.Add(Me.Label1, 3, 0)
Me.TableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Top
Me.TableLayoutPanel1.Location = New System.Drawing.Point(0, 0)
Me.TableLayoutPanel1.Name = "TableLayoutPanel1"
Me.TableLayoutPanel1.RowCount = 1
Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
Me.TableLayoutPanel1.Size = New System.Drawing.Size(1019, 38)
Me.TableLayoutPanel1.TabIndex = 5
'
'Label2
'
Me.Label2.Dock = System.Windows.Forms.DockStyle.Fill
Me.Label2.Location = New System.Drawing.Point(203, 0)
Me.Label2.Name = "Label2"
Me.Label2.Size = New System.Drawing.Size(74, 38)
Me.Label2.TabIndex = 3
Me.Label2.Text = "실행범위"
Me.Label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
'
'Frm_Macro2
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(7.0!, 12.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(1019, 514)
Me.Controls.Add(Me.FpSpread1)
Me.Controls.Add(Me.TableLayoutPanel1)
Me.Controls.Add(Me.ProgressBar1)
Me.Name = "Frm_Macro2"
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
Me.Text = "일괄처리"
CType(Me.FpSpread1, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.FpSpread1_Sheet1, System.ComponentModel.ISupportInitialize).EndInit()
Me.TableLayoutPanel1.ResumeLayout(False)
Me.TableLayoutPanel1.PerformLayout()
Me.ResumeLayout(False)
End Sub
Friend WithEvents FpSpread1 As FarPoint.Win.Spread.FpSpread
Friend WithEvents FpSpread1_Sheet1 As FarPoint.Win.Spread.SheetView
Friend WithEvents Button1 As System.Windows.Forms.Button
Friend WithEvents Button2 As System.Windows.Forms.Button
Friend WithEvents tbStart As System.Windows.Forms.TextBox
Friend WithEvents Button3 As System.Windows.Forms.Button
Friend WithEvents ProgressBar1 As System.Windows.Forms.ProgressBar
Friend WithEvents tbEnd As System.Windows.Forms.TextBox
Friend WithEvents Label1 As System.Windows.Forms.Label
Friend WithEvents TableLayoutPanel1 As System.Windows.Forms.TableLayoutPanel
Friend WithEvents Label2 As System.Windows.Forms.Label
End Class

View File

@@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="FpSpread1_Sheet1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

View File

@@ -0,0 +1,841 @@
Public Class Frm_Macro2
Dim fn As String = ""
Dim 단위면적당신재생1차에너지합 As Decimal = 0
Dim 단위면적당1차에너소비량합 As Decimal = 0
Dim 에너지자립률 As Double = 0
Public Sub New()
' 이 호출은 디자이너에 필요합니다.
InitializeComponent()
fn = ""
' InitializeComponent() 호출 뒤에 초기화 코드를 추가하십시오.
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
LoadFile()
End Sub
Private Sub LoadFile()
Dim od As New OpenFileDialog
od.Filter = "excel|*.xls|*.*|*.*"
od.FilterIndex = 1
If (od.ShowDialog() <> Windows.Forms.DialogResult.OK) Then Return
fn = od.FileName
If Not System.IO.File.Exists(fn) Then
MsgBox("업로드샘플파일(" + fn + ")가 존재하지 않습니다", MsgBoxStyle.Critical, "확인")
Return
End If
Try
If Me.FpSpread1.OpenExcel(fn) Then
'// MakeData()
'//첫줄에 열 번호를 넣는다.
For col As Integer = 1 To 108
Dim oldvalue As Object = FpSpread1_Sheet1.Cells(0, col - 1).Value
If oldvalue Is Nothing Then
FpSpread1_Sheet1.Cells(0, col - 1).Value = "(" + col.ToString() + ")"
Else
FpSpread1_Sheet1.Cells(0, col - 1).Value = oldvalue.ToString() + "(" + col.ToString() + ")"
End If
Next
'//0번째열에서 1의 값을 찾고 그 이후의 값을 찾아서 번호를 설정한다.
Dim StartIndex As Integer = 0
Dim EndIndex As Integer = 0
ProgressBar1.Minimum = 0
ProgressBar1.Maximum = 10000
ProgressBar1.Value = 0
For i As Integer = 0 To 65535
If i >= ProgressBar1.Maximum - 1 Then
ProgressBar1.Value = ProgressBar1.Maximum
Else
ProgressBar1.Value += 1
End If
Dim curval As Object = FpSpread1_Sheet1.Cells(i, 0).Value
If curval Is Nothing Then
If StartIndex <> 0 Then
EndIndex = i - 1
Exit For
Else
Continue For
End If
End If
If curval.ToString() = "1" Then
StartIndex = i
ElseIf StartIndex <> 0 Then
If curval.ToString() = "" Then
EndIndex = i - 1
Exit For
End If
End If
Next
tbStart.Text = (StartIndex + 1).ToString()
tbEnd.Text = (EndIndex + 1).ToString()
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "파일 불러오기 오류")
End Try
End Sub
Private Function RData(grp As String, code As Integer) As Decimal
Dim filter As String = String.Format("GRP='{0}' and code={1}", grp, code.ToString("000"))
Dim DR() As DSR.TReqUseRow = DSETR1.TReqUse.Select(filter)
If DR.GetUpperBound(0) = -1 Then Return 0
Return DR(0).M00
End Function
Private Sub Frm_Upload_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
End Sub
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
Dim sd As New SaveFileDialog()
sd.Filter = "Excel(*.xls)|*.xls"
sd.FilterIndex = 0
If sd.ShowDialog = Windows.Forms.DialogResult.OK Then
Try
If FpSpread1.SaveExcel(sd.FileName, FarPoint.Excel.ExcelSaveFlags.NoFlagsSet) Then
MsgBox("저장완료", MsgBoxStyle.Information, "확인")
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "error")
End Try
End If
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
'//기본홤녀은 건물개요로
MdiMain.Menu_건물개요()
Dim StartNo As Integer = CInt(tbStart.Text)
Dim EndNo As Integer = CInt(tbEnd.Text)
Me.ProgressBar1.Value = 0
Me.ProgressBar1.Minimum = 0
Me.ProgressBar1.Maximum = EndNo - StartNo + 1
If MsgBox("전체 실행전에 1건에대해서 테스트실행을 하시겠습니까?", MsgBoxStyle.Question Or MsgBoxStyle.YesNo, "확인") = MsgBoxResult.Yes Then
EndNo = StartNo
ElseIf MsgBox("전체 " + Me.ProgressBar1.Maximum.ToString() + "건의 자료를 실행하시겠습니까?" + vbCrLf + "이 작업은 중단할 수 없습니다", MsgBoxStyle.Question Or MsgBoxStyle.YesNo, "확인") <> MsgBoxResult.Yes Then
Return
End If
For RowNum As Integer = StartNo To EndNo
Me.ProgressBar1.Value += 1
Dim Row = RowNum - 1
Dim ColIDX As Integer = 1
'//건물개요
'//DSET1.tbl_Desc.Clear()
Dim NewDesc As DS.tbl_DescRow = DSET1.tbl_Desc.Rows(0)
NewDesc.cname = FpSpread1_Sheet1.Cells(Row, 1).Value.ToString()
NewDesc.buildname = NewDesc.cname
NewDesc.builds1 = 1 '//지하(층수)
NewDesc.builds2 = 1 '//지상(층수)
'//지역(해당하는이름의 코드를 가져와서 설정해야함)
Dim 지역명 As String = FpSpread1_Sheet1.Cells(Row, 5).Value
Dim 지역목록() As DataRow = DSET1.weather_group.Select(String.Format("name = '{0}'", 지역명))
If 지역목록.Length <> 1 Then
MsgBox(String.Format("{0}번줄 지역({1})에 해당하는 데이터가 {2}건 있습니다", Row, 지역명, 지역목록.Length))
Return
End If
NewDesc.buildarea = 지역목록(0)("code")
NewDesc.EndEdit()
'DSET1.tbl_Desc.Addtbl_DescRow(NewDesc)
Dim Drows() As DataRow
'//건물용도
Dim 건물용도명 As String = FpSpread1_Sheet1.Cells(Row, 6).Value.ToString().Replace(vbLf, "").Replace(vbCr, "") '//건물용도
Drows = DSET1.tbl_common.Select(String.Format("gubun='1201' and name = '{0}'", 건물용도명))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 건물용도({1})에 해당하는 데이터가 {2}건 있습니다", Row, 건물용도명, Drows.Length))
Return
End If
NewDesc.isjugo = Drows(0)("valn1")
NewDesc.EndEdit()
'//입력존
DSET1.tbl_zone.Clear()
'/없음데이터도 생성해야한다.
Dim drZoneNull As DS.tbl_zoneRow = DSET1.tbl_zone.Newtbl_zoneRow
drZoneNull.code = "0"
drZoneNull.설명 = "(없음)"
DSET1.tbl_zone.Addtbl_zoneRow(drZoneNull)
Dim DrZone As DS.tbl_zoneRow = DSET1.tbl_zone.Newtbl_zoneRow
DrZone.code = "00001"
DrZone.조명부하산출방법 = "입력치"
DrZone.설명 = "입력존(매크로)"
DrZone.그룹 = "0"
DrZone.sortkey = DrZone.code
DrZone.열생산난방생산기기 = "00001" '//난방기기 임시로 적용처리함()
DrZone.열생산급탕생산기기 = "00001" '//급탕기기 임시로 적용처리함()
DrZone.냉난방열공급시스템 = "00001" '//열공급시스템연결
DrZone.냉난방열공급시스템수 = "1"
DrZone.냉난방공조처리시스템 = "00001"
DrZone.인공광원 = "(없음)"
DrZone.조명방식 = "(없음)"
DrZone.외기부하처리여부 = "아니오"
DrZone.설명 = FpSpread1_Sheet1.Cells(Row, 7).Value
Dim 사용프로필 As String = FpSpread1_Sheet1.Cells(Row, 8).Value
Drows = DSET1.tbl_profile.Select(String.Format("설명 like '%{0}'", 사용프로필))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 입력존-사용프로필({1})에 해당하는 데이터가 {2}건 있습니다", Row, 사용프로필, Drows.Length))
Return
End If
DrZone.프로필 = Drows(0)("code")
DrZone.면적 = FpSpread1_Sheet1.Cells(Row, 9).Value
DrZone.천장고p = FpSpread1_Sheet1.Cells(Row, 10).Value
DrZone.순실체적 = FpSpread1_Sheet1.Cells(Row, 11).Value
Dim 열저장능력 As String = FpSpread1_Sheet1.Cells(Row, 12).Value
Drows = DSET1.tbl_common.Select(String.Format("gubun='1023' and name = '{0}'", 열저장능력))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 입력존-열저장능력({1})에 해당하는 데이터가 {2}건 있습니다", Row, 열저장능력, Drows.Length))
Return
End If
DrZone.열저장능력 = Drows(0)("Name")
Dim 열교가산치 As String = FpSpread1_Sheet1.Cells(Row, 13).Value
Drows = DSET1.tbl_common.Select(String.Format("gubun='1022' and name = '{0}'", 열교가산치))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 입력존-열교가산치({1})에 해당하는 데이터가 {2}건 있습니다", Row, 열교가산치, Drows.Length))
Return
End If
DrZone.열교가산치 = Drows(0)("Name")
DrZone.침기율 = FpSpread1_Sheet1.Cells(Row, 14).Value
Dim 냉난방방식 As String = FpSpread1_Sheet1.Cells(Row, 15).Value
If 냉난방방식 = "없음" Then 냉난방방식 = "기능없음"
Drows = DSET1.tbl_common.Select(String.Format("gubun='1000' and name = '{0}'", 냉난방방식))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 입력존-냉난방방식({1})에 해당하는 데이터가 {2}건 있습니다", Row, 냉난방방식, Drows.Length))
Return
End If
DrZone.냉난방방식 = Drows(0)("name")
Dim 냉난방공조 As String = FpSpread1_Sheet1.Cells(Row, 16).Value
If 냉난방공조 = "없음" Then 냉난방공조 = "기능없음"
Drows = DSET1.tbl_common.Select(String.Format("gubun='1001' and name = '{0}'", 냉난방공조))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 입력존-냉난방공조({1})에 해당하는 데이터가 {2}건 있습니다", Row, 냉난방공조, Drows.Length))
Return
End If
DrZone.냉난방공조 = Drows(0)("name")
Dim 조명부하산출방법 As String = FpSpread1_Sheet1.Cells(Row, 17).Value
Drows = DSET1.tbl_common.Select(String.Format("gubun='1031' and name = '{0}'", 조명부하산출방법))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 입력존-조명부하산출방법({1})에 해당하는 데이터가 {2}건 있습니다", Row, 조명부하산출방법, Drows.Length))
Return
End If
DrZone.조명부하산출방법 = Drows(0)("name")
DrZone.조명에너지부하율입력치 = FpSpread1_Sheet1.Cells(Row, 18).Value
DSET1.tbl_zone.Addtbl_zoneRow(DrZone)
'//입력면
Dim 방위목록 As New List(Of String)
방위목록.AddRange({"북서", "", "남서", "", "남동", "", "북동", "", "수평", "일사없음", "(없음)"})
Dim 제목1 As String = ""
Dim 제목2 As String = ""
DSET1.tbl_myoun.Clear()
For i As Integer = 0 To 12
Dim NewMyoun As DS.tbl_myounRow = DSET1.tbl_myoun.Newtbl_myounRow
NewMyoun.존분류 = DrZone.code
NewMyoun.code = String.Format("{0:00000}", i + 1)
NewMyoun.sortkey = NewMyoun.code
Dim t1 As String = FpSpread1_Sheet1.Cells(2, 19 + (i * 2)).Value '//타이틀
Dim t2 As String = FpSpread1_Sheet1.Cells(3, 19 + (i * 2)).Value '//타이틀
If Not String.IsNullOrEmpty(t1) Then 제목1 = t1
If Not String.IsNullOrEmpty(t2) Then 제목2 = t2
NewMyoun.설명 = 제목1 + ":" + 제목2
'//공용코드 1067에서 name 이 일치하는 데이터가 있어야한다.
'//(없음),외벽,외부창,내벽,간벽,내부창
If i = 0 Then
NewMyoun.건축부위방식 = "외벽"
ElseIf i = 1 Then
NewMyoun.건축부위방식 = "외벽"
ElseIf i = 2 Then
NewMyoun.건축부위방식 = "내벽"
ElseIf i = 3 Then
NewMyoun.건축부위방식 = "내벽"
ElseIf i = 4 Then
NewMyoun.건축부위방식 = "외벽"
ElseIf i = 5 Then '//코어
NewMyoun.건축부위방식 = "내벽"
ElseIf i = 6 Then '//쎼떄깐뼊(쪠외)
NewMyoun.건축부위방식 = "간벽"
ElseIf i = 7 Or i = 8 Then
NewMyoun.건축부위방식 = "외부창"
ElseIf i = 9 Or i = 10 Or i = 11 Or i = 12 Then
NewMyoun.건축부위방식 = "내부창"
End If
Dim 방위1 As String = FpSpread1_Sheet1.Cells(Row, 19 + (i * 2)).Value '//타이틀
방위1 = 방위1.ToString().Replace(vbLf, "").Replace(vbCr, "")
If 방위목록.IndexOf(방위1) = -1 Then
MsgBox(String.Format("{0}번줄 입력면-방위1({1})에 해당하는 데이터가 없습니다.", Row, 방위1))
Return
End If
NewMyoun.방위 = 방위1
NewMyoun.건축부위면적 = FpSpread1_Sheet1.Cells(Row, 20 + (i * 2)).Value
DSET1.tbl_myoun.Addtbl_myounRow(NewMyoun)
Next
'//지붕 (45)
Dim NewM지붕 As DS.tbl_myounRow = DSET1.tbl_myoun.Newtbl_myounRow
NewM지붕.존분류 = DrZone.code
NewM지붕.code = String.Format("{0:00000}", 14)
NewM지붕.sortkey = NewM지붕.code
NewM지붕.방위 = "수평"
NewM지붕.건축부위방식 = "외벽"
NewM지붕.건축부위면적 = FpSpread1_Sheet1.Cells(Row, 45).Value
DSET1.tbl_myoun.Addtbl_myounRow(NewM지붕)
'//바닥 (46)
Dim NewM바닥 As DS.tbl_myounRow = DSET1.tbl_myoun.Newtbl_myounRow
NewM바닥.존분류 = DrZone.code
NewM바닥.code = String.Format("{0:00000}", 15)
NewM바닥.sortkey = NewM지붕.code
NewM바닥.방위 = "일사없음"
NewM바닥.건축부위방식 = "외벽"
NewM바닥.건축부위면적 = FpSpread1_Sheet1.Cells(Row, 46).Value
DSET1.tbl_myoun.Addtbl_myounRow(NewM바닥)
'//공조처리
DSET1.tbl_kongjo.Clear()
Dim New공조 As DS.tbl_kongjoRow = DSET1.tbl_kongjo.Newtbl_kongjoRow
New공조.code = "00001"
New공조.팬효율산출방식 = "계산치"
New공조.설명 = "공조기기"
New공조.설정치난방 = "0"
New공조.설정치냉방 = "0"
New공조.최대풍량 = "0"
New공조.리턴공기혼합여부 = "아니오"
New공조.가습기유형 = "(없음)"
New공조.외기냉방제어유무 = ""
New공조.열교환기유형 = "(없음)"
New공조.열회수율 = "0"
New공조.열회수율냉 = "공조기기"
New공조.급기풍량 = "0"
New공조.배기풍량 = "0"
New공조.급기팬동력 = "0"
New공조.배기팬동력 = "0"
New공조.총압력손실급기팬 = "0"
New공조.총압력손실배기팬 = "0"
New공조.총효율급기팬 = "0"
New공조.총효율배기팬 = "0"
Dim 공조방식 As String = FpSpread1_Sheet1.Cells(Row, 47).Value
If 공조방식 = "없음" Then 공조방식 = "(없음)"
Drows = DSET1.tbl_common.Select(String.Format("gubun='1026' and name = '{0}'", 공조방식))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 공조처리-공조방식({1})에 해당하는 데이터가 {2}건 있습니다", Row, 공조방식, Drows.Length))
Return
End If
New공조.공조방식 = Drows(0)("name")
DSET1.tbl_kongjo.Addtbl_kongjoRow(New공조)
'//난방기기
DSET1.tbl_nanbangkiki.Clear()
ColIDX = 48
Dim New난방 As DS.tbl_nanbangkikiRow = DSET1.tbl_nanbangkiki.Newtbl_nanbangkikiRow
New난방.code = "00001"
New난방.설명 = "보일러"
New난방.신재생연결여부 = "연결없음"
New난방.보일러대수 = "1"
Dim 난방_열생산기기방식 As String = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
Drows = DSET1.tbl_common.Select(String.Format("gubun='1020' and name = '{0}'", 난방_열생산기기방식))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 난방기기-열생산기기방식({1})에 해당하는 데이터가 {2}건 있습니다", Row, 난방_열생산기기방식, Drows.Length))
Return
End If
New난방.열생산기기방식 = Drows(0)("name")
Dim 난방_사용연료 As String = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
Drows = DSET1.tbl_common.Select(String.Format("gubun='1021' and name = '{0}'", 난방_사용연료))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 난방기기-사용연료({1})에 해당하는 데이터가 {2}건 있습니다", Row, 난방_사용연료, Drows.Length))
Return
End If
New난방.사용연료 = Drows(0)("name")
New난방.보일러정격출력 = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
New난방.급수온도 = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
New난방.환수온도 = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
Dim 난방생산기기운전방식 As String = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
Drows = DSET1.tbl_common.Select(String.Format("gubun='1035' and name = '{0}'", 난방생산기기운전방식))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 난방기기-난방생산기기운전방식({1})에 해당하는 데이터가 {2}건 있습니다", Row, 난방생산기기운전방식, Drows.Length))
Return
End If
New난방.운전방식 = Drows(0)("name")
Dim 난방_열원기기_보일러방식 As String = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
If 난방_열원기기_보일러방식.IndexOf("보일러") = -1 Then 난방_열원기기_보일러방식 += "보일러"
Drows = DSET1.tbl_common.Select(String.Format("gubun='1036' and name = '{0}'", 난방_열원기기_보일러방식))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 난방기기-열원기기_보일러방식({1})에 해당하는 데이터가 {2}건 있습니다", Row, 난방_열원기기_보일러방식, Drows.Length))
Return
End If
New난방.보일러방식 = Drows(0)("name")
New난방.정격보일러효율 = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
Dim 난방_축열탱크방식 As String = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
Drows = DSET1.tbl_common.Select(String.Format("gubun='1039' and name = '{0}'", 난방_축열탱크방식))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 난방기기-급탕축열탱크방식({1})에 해당하는 데이터가 {2}건 있습니다", Row, 난방_축열탱크방식, Drows.Length))
Return
End If
New난방.축열탱크방식 = Drows(0)("name")
Dim 난방_급탕_시스템방식 As String = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
Drows = DSET1.tbl_common.Select(String.Format("gubun='1042' and name = '{0}'", 난방_급탕_시스템방식))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 난방기기-급탕_시스템방식({1})에 해당하는 데이터가 {2}건 있습니다", Row, 난방_급탕_시스템방식, Drows.Length))
Return
End If
New난방.분배시스템방식 = Drows(0)("name")
'//입력존에서 열생산기기 급탕이 연결되지 않았다.
'//순환무우를 비롯 급탕기기를 사용하려면 급탕기기가 연결되어야한다.
Dim 난방_급탕_순환유무 As String = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
Drows = DSET1.tbl_common.Select(String.Format("gubun='1032' and name = '{0}'", 난방_급탕_순환유무))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 난방기기-급탕_순환유무({1})에 해당하는 데이터가 {2}건 있습니다", Row, 난방_급탕_순환유무, Drows.Length))
Return
End If
New난방.순환유무 = Drows(0)("name")
Dim 난방_급탕_펌프제어 As String = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
Drows = DSET1.tbl_common.Select(String.Format("gubun='1043' and name = '{0}'", 난방_급탕_펌프제어))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 난방기기-급탕_펌프제어({1})에 해당하는 데이터가 {2}건 있습니다", Row, 난방_급탕_펌프제어, Drows.Length))
Return
End If
New난방.펌프제어 = Drows(0)("name")
New난방.펌프동력급탕 = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
Dim 난방_배관망유형 As String = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
Drows = DSET1.tbl_common.Select(String.Format("gubun='1040' and name = '{0}'", 난방_배관망유형))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 난방기기-배관망유형({1})에 해당하는 데이터가 {2}건 있습니다", Row, 난방_배관망유형, Drows.Length))
Return
End If
New난방.배관망유형 = Drows(0)("name")
Dim 난방_펌프감소계수 As String = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
Drows = DSET1.tbl_common.Select(String.Format("gubun='1002' and name = '{0}'", 난방_펌프감소계수))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 난방기기-펌프감소계수({1})에 해당하는 데이터가 {2}건 있습니다", Row, 난방_펌프감소계수, Drows.Length))
Return
End If
New난방.펌프교정계수 = Drows(0)("name")
Dim 난방_펌프제어유형 As String = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
Drows = DSET1.tbl_common.Select(String.Format("gubun='1041' and name = '{0}'", 난방_펌프제어유형))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 난방기기-펌프제어유형({1})에 해당하는 데이터가 {2}건 있습니다", Row, 난방_펌프제어유형, Drows.Length))
Return
End If
New난방.펌프제어유형 = Drows(0)("name")
New난방.펌프동력급탕 = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
DSET1.tbl_nanbangkiki.Addtbl_nanbangkikiRow(New난방)
'//난방공급시스템
DSET1.tbl_kongkub.Clear()
Dim New공급 As DS.tbl_kongkubRow = DSET1.tbl_kongkub.Newtbl_kongkubRow
New공급.code = "00001"
New공급.설명 = "난방공급"
New공급.제어기의정격전력 = "0"
New공급.팬송풍기정격전력 = "0"
New공급.펌프정격전력 = "0"
New공급.팬송풍기수 = "0"
New공급.추가펌프수 = "0"
Dim 난방공급시스템 As String = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
Drows = DSET1.tbl_common.Select(String.Format("gubun='1045' and name = '{0}'", 난방공급시스템))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 난방공급-시스템({1})에 해당하는 데이터가 {2}건 있습니다", Row, 난방공급시스템, Drows.Length))
Return
End If
New공급.열공급시스템 = Drows(0)("name")
Dim 열공급생산기기 As String = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
Drows = DSET1.tbl_nanbangkiki.Select(String.Format("설명 = '{0}'", 열공급생산기기))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 난방공급-열공급생산시기({1})에 해당하는 데이터가 {2}건 있습니다", Row, 열공급생산기기, Drows.Length))
Return
End If
New공급.열공급생산기기 = Drows(0)("code")
Dim 바닥난방열제어 As String = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
Drows = DSET1.tbl_common.Select(String.Format("gubun='1033' and name = '{0}'", 바닥난방열제어))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 난방공급-바닥난방열제어({1})에 해당하는 데이터가 {2}건 있습니다", Row, 바닥난방열제어, Drows.Length))
Return
End If
New공급.바닥난방열제어 = Drows(0)("name")
Dim 바닥난방열건축부위 As String = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
Drows = DSET1.tbl_common.Select(String.Format("gubun='1034' and name = '{0}'", 바닥난방열건축부위))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 난방공급-바닥난방열건축부위({1})에 해당하는 데이터가 {2}건 있습니다", Row, 바닥난방열건축부위, Drows.Length))
Return
End If
New공급.바닥난방열건축부위 = Drows(0)("name")
DSET1.tbl_kongkub.Addtbl_kongkubRow(New공급)
'//냉방기기
DSET1.tbl_nangbangkiki.Clear()
Dim New냉방 As DS.tbl_nangbangkikiRow = DSET1.tbl_nangbangkiki.Newtbl_nangbangkikiRow
New냉방.code = "00001"
New냉방.설명 = "냉방기기"
New냉방.신재생연결여부 = "연결없음"
Dim 냉동기방식 As String = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
If 냉동기방식 = "없음" Then 냉동기방식 = "(없음)"
Drows = DSET1.tbl_common.Select(String.Format("gubun='1046' and name = '{0}'", 냉동기방식))
If Drows.Length <> 1 Then
MsgBox(String.Format("{0}번줄 냉방기기-냉동기방식({1})에 해당하는 데이터가 {2}건 있습니다", Row, 냉동기방식, Drows.Length))
Return
End If
New냉방.냉동기방식 = Drows(0)("name")
New냉방.냉동기용량 = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
New냉방.열성능비 = FpSpread1_Sheet1.Cells(Row, ColIDX).Value : ColIDX += 1
If Not IsNumeric(New냉방.냉동기용량) Then New냉방.냉동기용량 = "0"
If Not IsNumeric(New냉방.열성능비) Then New냉방.열성능비 = "0"
DSET1.tbl_nangbangkiki.Addtbl_nangbangkikiRow(New냉방)
'//열관류율
'//면형태를 입력해야함 이것은 공용코드 1088에 들어있으며 코드형태로 들어간다
'//외벽(벽체),외벽(지붕),외벽(바닥),내벽(벽체),내벽(지붕),내벽(바닥),간벽,외부창,내부창,지중벽
DSET1.tbl_yk.Clear()
'//직접면하는
For Each dr면 As DS.tbl_myounRow In DSET1.tbl_myoun.Select("건축부위방식='외벽'")
dr면.열관류율 = FpSpread1_Sheet1.Cells(Row, ColIDX).Value
Next : ColIDX += 1
'//간접면하는
For Each dr면 As DS.tbl_myounRow In DSET1.tbl_myoun.Select("건축부위방식='내벽'")
dr면.열관류율 = FpSpread1_Sheet1.Cells(Row, ColIDX).Value
Next : ColIDX += 1
'//바닥
For Each dr면 As DS.tbl_myounRow In DSET1.tbl_myoun.Select("건축부위방식='외벽' and 방위='일사없음'") '//2018.04.24 수정
dr면.열관류율 = FpSpread1_Sheet1.Cells(Row, ColIDX).Value
Next : ColIDX += 1
'//지붕벽체
For Each dr면 As DS.tbl_myounRow In DSET1.tbl_myoun.Select("건축부위방식='외벽' and 방위='수평'") '//2018.04.24 수정
dr면.열관류율 = FpSpread1_Sheet1.Cells(Row, ColIDX).Value
Next : ColIDX += 1
'//현관문
For Each dr면 As DS.tbl_myounRow In DSET1.tbl_myoun.Select("건축부위방식='내부창' and 방위='일사없음'") '//2018.04.24 수정
dr면.투과율 = FpSpread1_Sheet1.Cells(Row, ColIDX).Value
dr면.열관류율 = FpSpread1_Sheet1.Cells(Row, ColIDX + 1).Value
Next : ColIDX += 2
'//확장창
For Each dr면 As DS.tbl_myounRow In DSET1.tbl_myoun.Select("건축부위방식='외부창'")
dr면.투과율 = FpSpread1_Sheet1.Cells(Row, ColIDX).Value
dr면.열관류율 = FpSpread1_Sheet1.Cells(Row, ColIDX + 1).Value
Next : ColIDX += 2
'//세대창
For Each dr면 As DS.tbl_myounRow In DSET1.tbl_myoun.Select("건축부위방식='내부창' and 방위<>'일사없음'") '//2018.04.24 수정
dr면.투과율 = FpSpread1_Sheet1.Cells(Row, ColIDX).Value
dr면.열관류율 = FpSpread1_Sheet1.Cells(Row, ColIDX + 1).Value
Next : ColIDX += 2
'//입력면의 자료를 업데이트해준다.
DSET1.AcceptChanges()
'//계산실행
Run_Calc(Row)
Next
If Not msgf Is Nothing Then
msgf.Close()
msgf.Dispose()
msgf = Nothing
End If
If StartNo = EndNo Then
Report_그래프.Visible = False
Report_그래프.Show()
End If
End Sub
Sub Run_Calc(Row As Integer)
'//현재데이터상태를 저장
DSET1.AcceptChanges()
DSETR1.AcceptChanges()
Dim Type As Calculator.ECalc = Calculator.ECalc.All '//요구량+소요량
Dim showmsg As String = "" '//추가표시메세지
Dim St As Date = Now '//계산시작
pLog.Add(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
pLog.Add(String.Format("계산실행({0})", Type.ToString()))
pLog.Add(String.Format("시작시간 : {0}", St.ToString()))
pLog.Add("----------------------------------")
Dim Result As Boolean = Calc.Start(showmsg, Type, LogSB, 0)
Dim Ts As TimeSpan = Now - St '//계산경과시간을 표시해준다.
Dim calc_ok As Integer = 0
If Result Then '//파라미터 True 라면 소요량이 추가로 게산된다.
Calc.Summary.All()
If LogSB.ToString <> "" Then
FpSpread1_Sheet1.Cells(Row, 97).Value = LogSB.ToString
Else
FpSpread1_Sheet1.Cells(Row, 97).Value = "시간:" + Ts.ToString()
calc_ok = 1 '================================2014.04.17 계산이 완료되면 그래프를 보여줌
End If
Else
FpSpread1_Sheet1.Cells(Row, 97).Value = LogSB.ToString
End If
'//상태메세지창이 열려있다면 제거해준다.
If calc_ok = 1 Then
'//해당값을 기록한다.
Extract_Data(Row)
Else
'//빈값으로 기록을 한다.
Dim StartIDX As Integer = 100
For idx As Integer = StartIDX To StartIDX + 13
FpSpread1_Sheet1.Cells(Row, idx).Value = "--"
Next
End If
End Sub
Sub Extract_Data(Row As Integer)
Dim 신재생에너지 As Decimal
Dim 난방에너지 As Decimal
Dim 냉방에너지 As Decimal
Dim 급탕에너지 As Decimal
Dim 조명에너지 As Decimal
Dim 환기에너지 As Decimal
'Dim 합계 As Decimal
Dim BaseIndex As Integer = 90
Dim Dr2 As DSR.Graph_ReqUseRow
For Gubun As Short = 0 To 4
Select Case Gubun
Case 0 '//1차에너지소요량
Dim Sum As Decimal = (Result1.생산E(0).태양광전력생산량 + Result1.생산E(0).신재생열병합전력생산량) / (Result1.일차E소요량(0).난방전력 + Result1.일차E소요량(0).냉방전력 + Result1.일차E소요량(0).급탕전력 + Result1.일차E소요량(0).조명전력 + Result1.일차E소요량(0).환기전력)
Dim 난방 As Decimal = Sum * Result1.일차E소요량(0).난방전력 '//아마게산이안도잇으니 여기값들이 0이잇을거에요.
Dim 냉방 As Decimal = Sum * Result1.일차E소요량(0).냉방전력
Dim 조명 As Decimal = Sum * Result1.일차E소요량(0).조명전력
Dim 급탕 As Decimal = Sum * Result1.일차E소요량(0).급탕전력
Dim 환기 As Decimal = Sum * Result1.일차E소요량(0).환기전력
Dim 난방면적 As Decimal = 0
Dim 냉방면적 As Decimal = 0
Dim 조명면적 As Decimal = 0
Dim 급탕면적 As Decimal = 0
Dim 환기면적 As Decimal = 0
If Result1.사용면적.H <> 0 Then
난방면적 = TOSG(IIf(난방 = 0, 0, 난방 / Result1.사용면적.H))
End If
If Result1.사용면적.C <> 0 Then
냉방면적 = TOSG(IIf(냉방 = 0, 0, 냉방 / Result1.사용면적.C))
End If
If Result1.사용면적.L <> 0 Then
조명면적 = TOSG(IIf(조명 = 0, 0, 조명 / Result1.사용면적.L))
End If
If Result1.사용면적.W <> 0 Then
급탕면적 = TOSG(IIf(급탕 = 0, 0, 급탕 / Result1.사용면적.W))
End If
If Result1.사용면적.V <> 0 Then
환기면적 = TOSG(IIf(환기 = 0, 0, 환기 / Result1.사용면적.V))
End If
Dim 전기 As Decimal = 난방면적 + 냉방면적 + 조명면적 + 급탕면적 + 환기면적
'//열병합신재생에너지추가 130831 arin
신재생에너지 = -1 * (Result1.생산E(0).면적당생산량태양열 + Result1.생산E(0).신재생면적당열생산량 + Result1.생산E(0).면적당생산량지열 + 전기 * 2.75)
'//1차에너지소요량
난방에너지 = Result1.일차E소요량(0).난방면적
냉방에너지 = Result1.일차E소요량(0).냉방면적
급탕에너지 = Result1.일차E소요량(0).급탕면적
조명에너지 = Result1.일차E소요량(0).조명면적
환기에너지 = Result1.일차E소요량(0).환기면적
FpSpread1_Sheet1.Cells(Row, BaseIndex).Value = 난방에너지 + 냉방에너지 + 급탕에너지 + 조명에너지 + 환기에너지
FpSpread1_Sheet1.Cells(Row, BaseIndex + 8).Value = 난방에너지
FpSpread1_Sheet1.Cells(Row, BaseIndex + 9).Value = 냉방에너지
FpSpread1_Sheet1.Cells(Row, BaseIndex + 10).Value = 급탕에너지
FpSpread1_Sheet1.Cells(Row, BaseIndex + 11).Value = 조명에너지
FpSpread1_Sheet1.Cells(Row, BaseIndex + 12).Value = 환기에너지
Case 1 '//에너지소요량
Dim Sum As Decimal = (Result1.생산E(0).태양광전력생산량 + Result1.생산E(0).신재생열병합전력생산량) / (Result1.일차E소요량(0).난방전력 + Result1.일차E소요량(0).냉방전력 + Result1.일차E소요량(0).급탕전력 + Result1.일차E소요량(0).조명전력 + Result1.일차E소요량(0).환기전력)
Dim 난방 As Decimal = Sum * Result1.일차E소요량(0).난방전력 '//아마게산이안도잇으니 여기값들이 0이잇을거에요.
Dim 냉방 As Decimal = Sum * Result1.일차E소요량(0).냉방전력
Dim 조명 As Decimal = Sum * Result1.일차E소요량(0).조명전력
Dim 급탕 As Decimal = Sum * Result1.일차E소요량(0).급탕전력
Dim 환기 As Decimal = Sum * Result1.일차E소요량(0).환기전력
Dim 난방면적 As Decimal = 0
Dim 냉방면적 As Decimal = 0
Dim 조명면적 As Decimal = 0
Dim 급탕면적 As Decimal = 0
Dim 환기면적 As Decimal = 0
If Result1.사용면적.H <> 0 Then
난방면적 = TOSG(IIf(난방 = 0, 0, 난방 / Result1.사용면적.H))
End If
If Result1.사용면적.C <> 0 Then
냉방면적 = TOSG(IIf(냉방 = 0, 0, 냉방 / Result1.사용면적.C))
End If
If Result1.사용면적.L <> 0 Then
조명면적 = TOSG(IIf(조명 = 0, 0, 조명 / Result1.사용면적.L))
End If
If Result1.사용면적.W <> 0 Then
급탕면적 = TOSG(IIf(급탕 = 0, 0, 급탕 / Result1.사용면적.W))
End If
If Result1.사용면적.V <> 0 Then
환기면적 = TOSG(IIf(환기 = 0, 0, 환기 / Result1.사용면적.V))
End If
Dim 면적 As Decimal = 난방면적 + 냉방면적 + 조명면적 + 급탕면적 + 환기면적
'//열병합신재생에너지추가 130831 arin
신재생에너지 = -1 * (Result1.생산E(0).면적당생산량태양열 + Result1.생산E(0).신재생면적당열생산량 + Result1.생산E(0).면적당생산량지열) - 면적
난방에너지 = Result1.E소요량(0).난방면적
냉방에너지 = Result1.E소요량(0).냉방면적
급탕에너지 = Result1.E소요량(0).급탕면적
조명에너지 = Result1.E소요량(0).조명면적
환기에너지 = Result1.E소요량(0).환기면적
FpSpread1_Sheet1.Cells(Row, BaseIndex - 1).Value = 난방에너지 + 냉방에너지 + 급탕에너지 + 조명에너지 + 환기에너지
FpSpread1_Sheet1.Cells(Row, BaseIndex - 8).Value = 난방에너지
FpSpread1_Sheet1.Cells(Row, BaseIndex - 7).Value = 냉방에너지
FpSpread1_Sheet1.Cells(Row, BaseIndex - 6).Value = 급탕에너지
FpSpread1_Sheet1.Cells(Row, BaseIndex - 5).Value = 조명에너지
FpSpread1_Sheet1.Cells(Row, BaseIndex - 4).Value = 환기에너지
FpSpread1_Sheet1.Cells(Row, BaseIndex - 3).Value = 신재생에너지
Case 2 '//에너지요구량
신재생에너지 = 0
난방에너지 = Result1.E요구량(0).난방면적
냉방에너지 = Result1.E요구량(0).냉방면적
급탕에너지 = Result1.E요구량(0).급탕면적
조명에너지 = Result1.E요구량(0).조명면적
환기에너지 = 0
FpSpread1_Sheet1.Cells(Row, BaseIndex - 2).Value = 난방에너지 + 냉방에너지 + 급탕에너지 + 조명에너지 + 환기에너지
FpSpread1_Sheet1.Cells(Row, BaseIndex + 3).Value = 난방에너지
FpSpread1_Sheet1.Cells(Row, BaseIndex + 4).Value = 냉방에너지
FpSpread1_Sheet1.Cells(Row, BaseIndex + 5).Value = 급탕에너지
FpSpread1_Sheet1.Cells(Row, BaseIndex + 6).Value = 조명에너지
FpSpread1_Sheet1.Cells(Row, BaseIndex + 7).Value = 환기에너지
Case 3 '//co2발생량
신재생에너지 = 0
난방에너지 = Result1.Co2발생량(0).난방면적
냉방에너지 = Result1.Co2발생량(0).냉방면적
급탕에너지 = Result1.Co2발생량(0).급탕면적
조명에너지 = Result1.Co2발생량(0).조명면적
환기에너지 = Result1.Co2발생량(0).환기면적
FpSpread1_Sheet1.Cells(Row, BaseIndex + 1).Value = 난방에너지 + 냉방에너지 + 급탕에너지 + 조명에너지 + 환기에너지
Case 4 '//1차에너지소요량(+계수) + 131020
신재생에너지 = 0
If (Result1.사용면적.H_WF = 0) Then
난방에너지 = 0
Else
난방에너지 = Result1.일차E소요량(0).난방면적2 * Result1.사용면적.H / Result1.사용면적.H_WF
End If
If (Result1.사용면적.C_WF = 0) Then
냉방에너지 = 0
Else
냉방에너지 = TOSG(Result1.일차E소요량(0).냉방면적 * Result1.사용면적.C / Result1.사용면적.C_WF)
End If
If (Result1.사용면적.W_WF = 0) Then
급탕에너지 = 0
Else
급탕에너지 = Result1.일차E소요량(0).급탕면적2 * Result1.사용면적.W / Result1.사용면적.W_WF
End If
If (Result1.사용면적.L_WF = 0) Then
조명에너지 = 0
Else
조명에너지 = Result1.일차E소요량(0).조명면적 * Result1.사용면적.L / Result1.사용면적.L_WF
End If
If (Result1.사용면적.V_WF = 0) Then
환기에너지 = 0
Else
환기에너지 = Result1.일차E소요량(0).환기면적 * Result1.사용면적.V / Result1.사용면적.V_WF
End If
FpSpread1_Sheet1.Cells(Row, BaseIndex + 2).Value = 난방에너지 + 냉방에너지 + 급탕에너지 + 조명에너지 + 환기에너지
FpSpread1_Sheet1.Cells(Row, BaseIndex + 13).Value = 난방에너지
FpSpread1_Sheet1.Cells(Row, BaseIndex + 14).Value = 냉방에너지
FpSpread1_Sheet1.Cells(Row, BaseIndex + 15).Value = 급탕에너지
FpSpread1_Sheet1.Cells(Row, BaseIndex + 16).Value = 조명에너지
FpSpread1_Sheet1.Cells(Row, BaseIndex + 17).Value = 환기에너지
End Select
Next
End Sub
End Class

View File

@@ -256,6 +256,9 @@
단위면적당1차에너소비량합 = 난방에너지 + 냉방에너지 + 급탕에너지 + 조명에너지 + 환기에너지 + Math.Round(단위면적당신재생1차에너지합, 1)
단위면적당1차에너소비량합 += -신재생에너지_offsite
If 단위면적당1차에너소비량합 <> 0 Then
에너지자립률 = (Math.Round(단위면적당신재생1차에너지합, 1) / 단위면적당1차에너소비량합) * 100

View File

@@ -1211,7 +1211,7 @@ iif(Fields!type.Value="조명에너지","#765e00","#475e76")))))</Color>
<Paragraph>
<TextRuns>
<TextRun>
<Value>단위면적당 1차에너지생산량(대지내):</Value>
<Value>단위면적당 1차에너지생산량(대지내):</Value>
<Style>
<FontFamily>맑은 고딕</FontFamily>
<FontSize>8pt</FontSize>
@@ -1225,9 +1225,9 @@ iif(Fields!type.Value="조명에너지","#765e00","#475e76")))))</Color>
</Paragraphs>
<rd:DefaultName>Textbox2</rd:DefaultName>
<Top>0.09525cm</Top>
<Left>5.03112cm</Left>
<Left>4.92169cm</Left>
<Height>0.56825cm</Height>
<Width>5.042cm</Width>
<Width>5.50068cm</Width>
<ZIndex>1</ZIndex>
<Style>
<Border>
@@ -1245,7 +1245,7 @@ iif(Fields!type.Value="조명에너지","#765e00","#475e76")))))</Color>
<Paragraph>
<TextRuns>
<TextRun>
<Value>단위면적당 1차에너지소비량 : </Value>
<Value>단위면적당 1차에너지총소요량 : </Value>
<Style>
<FontFamily>맑은 고딕</FontFamily>
<FontSize>8pt</FontSize>
@@ -1259,9 +1259,9 @@ iif(Fields!type.Value="조명에너지","#765e00","#475e76")))))</Color>
</Paragraphs>
<rd:DefaultName>Textbox2</rd:DefaultName>
<Top>0.09525cm</Top>
<Left>11.5652cm</Left>
<Left>11.45937cm</Left>
<Height>0.56825cm</Height>
<Width>4.14242cm</Width>
<Width>4.88325cm</Width>
<ZIndex>2</ZIndex>
<Style>
<Border>
@@ -1329,7 +1329,7 @@ iif(Fields!type.Value="조명에너지","#765e00","#475e76")))))</Color>
</Paragraphs>
<rd:DefaultName>Textbox2</rd:DefaultName>
<Top>0.0635cm</Top>
<Left>9.99727cm</Left>
<Left>10.31477cm</Left>
<Height>0.56825cm</Height>
<Width>0.96366cm</Width>
<ZIndex>4</ZIndex>
@@ -1365,7 +1365,7 @@ iif(Fields!type.Value="조명에너지","#765e00","#475e76")))))</Color>
</Paragraphs>
<rd:DefaultName>Textbox2</rd:DefaultName>
<Top>0.0635cm</Top>
<Left>15.64413cm</Left>
<Left>16.27913cm</Left>
<Height>0.56825cm</Height>
<Width>1.15416cm</Width>
<ZIndex>5</ZIndex>
@@ -1436,7 +1436,7 @@ iif(Fields!type.Value="조명에너지","#765e00","#475e76")))))</Color>
<rd:DefaultName>Textbox2</rd:DefaultName>
<Top>0.58837cm</Top>
<Left>0.12253cm</Left>
<Height>0.56825cm</Height>
<Height>0.45cm</Height>
<Width>3.33808cm</Width>
<ZIndex>7</ZIndex>
<Style>
@@ -1455,7 +1455,7 @@ iif(Fields!type.Value="조명에너지","#765e00","#475e76")))))</Color>
<Paragraph>
<TextRuns>
<TextRun>
<Value>단위면적당 1차에너지생산량(대지외):</Value>
<Value>단위면적당 1차에너지생산량(대지외):</Value>
<Style>
<FontFamily>맑은 고딕</FontFamily>
<FontSize>8pt</FontSize>
@@ -1469,9 +1469,9 @@ iif(Fields!type.Value="조명에너지","#765e00","#475e76")))))</Color>
</Paragraphs>
<rd:DefaultName>Textbox2</rd:DefaultName>
<Top>0.58837cm</Top>
<Left>5.03112cm</Left>
<Height>0.56825cm</Height>
<Width>5.042cm</Width>
<Left>4.92169cm</Left>
<Height>0.45cm</Height>
<Width>5.50068cm</Width>
<ZIndex>8</ZIndex>
<Style>
<Border>
@@ -1539,7 +1539,7 @@ iif(Fields!type.Value="조명에너지","#765e00","#475e76")))))</Color>
</Paragraphs>
<rd:DefaultName>Textbox2</rd:DefaultName>
<Top>0.46137cm</Top>
<Left>9.99727cm</Left>
<Left>10.3546cm</Left>
<Height>0.56825cm</Height>
<Width>0.96366cm</Width>
<ZIndex>10</ZIndex>
@@ -1589,11 +1589,49 @@ iif(Fields!type.Value="조명에너지","#765e00","#475e76")))))</Color>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
<Textbox Name="Textbox14">
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>단위면적당 1차에너지생산량(대지외):</Value>
<Style>
<FontFamily>맑은 고딕</FontFamily>
<FontSize>8pt</FontSize>
<Color>Red</Color>
</Style>
</TextRun>
</TextRuns>
<Style>
<TextAlign>Right</TextAlign>
</Style>
</Paragraph>
</Paragraphs>
<rd:DefaultName>Textbox2</rd:DefaultName>
<Top>0.55662cm</Top>
<Left>11.75629cm</Left>
<Height>0.44125cm</Height>
<Width>5.042cm</Width>
<ZIndex>12</ZIndex>
<Visibility>
<Hidden>=iif(Parameters!bcustomprofile.Value = "1",false,true)</Hidden>
</Visibility>
<Style>
<Border>
<Style>None</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
</ReportItems>
<KeepTogether>true</KeepTogether>
<Top>19.37185cm</Top>
<Height>1.18837cm</Height>
<Width>17.87958cm</Width>
<Width>18.5cm</Width>
<ZIndex>4</ZIndex>
<Style>
<Border>
@@ -1601,44 +1639,6 @@ iif(Fields!type.Value="조명에너지","#765e00","#475e76")))))</Color>
</Border>
</Style>
</Rectangle>
<Textbox Name="Textbox14">
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>단위면적당 1차에너지생산량(대지외):</Value>
<Style>
<FontFamily>맑은 고딕</FontFamily>
<FontSize>8pt</FontSize>
<Color>Red</Color>
</Style>
</TextRun>
</TextRuns>
<Style>
<TextAlign>Right</TextAlign>
</Style>
</Paragraph>
</Paragraphs>
<rd:DefaultName>Textbox2</rd:DefaultName>
<Top>19.92847cm</Top>
<Left>11.21595cm</Left>
<Height>0.44125cm</Height>
<Width>5.042cm</Width>
<ZIndex>5</ZIndex>
<Visibility>
<Hidden>=iif(Parameters!bcustomprofile.Value = "1",false,true)</Hidden>
</Visibility>
<Style>
<Border>
<Style>None</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
</ReportItems>
<Height>20.56022cm</Height>
<Style />

View File

@@ -37,7 +37,6 @@ Partial Class MdiMain
Me.MenuStrip1 = New System.Windows.Forms.MenuStrip()
Me.ReportToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
Me.btNew = New System.Windows.Forms.ToolStripMenuItem()
Me.신규코드업로드ToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
Me.ToolStripMenuItem7 = New System.Windows.Forms.ToolStripSeparator()
Me.btOpen = New System.Windows.Forms.ToolStripMenuItem()
Me.bt_filesave = New System.Windows.Forms.ToolStripMenuItem()
@@ -58,6 +57,7 @@ Partial Class MdiMain
Me.환경설정ToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
Me.실행ToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
Me.btMacro = New System.Windows.Forms.ToolStripMenuItem()
Me.btMacro2 = New System.Windows.Forms.ToolStripMenuItem()
Me.bt_계산결과 = New System.Windows.Forms.ToolStripMenuItem()
Me.계산결과ToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
Me.bt_인증평가서 = New System.Windows.Forms.ToolStripMenuItem()
@@ -109,6 +109,7 @@ Partial Class MdiMain
Me.비교데이터백업ToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
Me.데이터비교ToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
Me.순실체적ToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
Me.ManualToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
Me.StatusStrip1.SuspendLayout()
Me.MenuStrip1.SuspendLayout()
Me.ContextMenuStrip1.SuspendLayout()
@@ -178,7 +179,7 @@ Partial Class MdiMain
'MenuStrip1
'
Me.MenuStrip1.Font = New System.Drawing.Font("돋움", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(129, Byte))
Me.MenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ReportToolStripMenuItem, Me.건물개요ToolStripMenuItem, Me.환경설정ToolStripMenuItem, Me.bt_계산결과, Me.결과그래프ToolStripMenuItem, Me.정보ToolStripMenuItem1, Me.bt_etc, Me.WindowsMenu, Me.btcustomprofile})
Me.MenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ReportToolStripMenuItem, Me.건물개요ToolStripMenuItem, Me.환경설정ToolStripMenuItem, Me.bt_계산결과, Me.결과그래프ToolStripMenuItem, Me.정보ToolStripMenuItem1, Me.bt_etc, Me.WindowsMenu, Me.btcustomprofile, Me.ManualToolStripMenuItem})
Me.MenuStrip1.Location = New System.Drawing.Point(0, 0)
Me.MenuStrip1.MdiWindowListItem = Me.WindowsMenu
Me.MenuStrip1.Name = "MenuStrip1"
@@ -188,7 +189,7 @@ Partial Class MdiMain
'
'ReportToolStripMenuItem
'
Me.ReportToolStripMenuItem.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.btNew, Me.신규코드업로드ToolStripMenuItem, Me.ToolStripMenuItem7, Me.btOpen, Me.bt_filesave, Me.btSaveNew, Me.정보ToolStripMenuItem, Me.bt_데이터관리, Me.btImport, Me.ToolStripMenuItem5, Me.lbl_p1, Me.lbl_p2, Me.lbl_p3, Me.lbl_p4, Me.lbl_p5, Me.ToolStripMenuItem6, Me.종료ToolStripMenuItem})
Me.ReportToolStripMenuItem.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.btNew, Me.ToolStripMenuItem7, Me.btOpen, Me.bt_filesave, Me.btSaveNew, Me.정보ToolStripMenuItem, Me.bt_데이터관리, Me.btImport, Me.ToolStripMenuItem5, Me.lbl_p1, Me.lbl_p2, Me.lbl_p3, Me.lbl_p4, Me.lbl_p5, Me.ToolStripMenuItem6, Me.종료ToolStripMenuItem})
Me.ReportToolStripMenuItem.Image = CType(resources.GetObject("ReportToolStripMenuItem.Image"), System.Drawing.Image)
Me.ReportToolStripMenuItem.Name = "ReportToolStripMenuItem"
Me.ReportToolStripMenuItem.Size = New System.Drawing.Size(57, 20)
@@ -201,14 +202,6 @@ Partial Class MdiMain
Me.btNew.Size = New System.Drawing.Size(244, 22)
Me.btNew.Text = "신규"
'
'신규코드업로드ToolStripMenuItem
'
Me.신규코드업로드ToolStripMenuItem.ForeColor = System.Drawing.Color.Red
Me.신규코드업로드ToolStripMenuItem.Name = "신규코드업로드ToolStripMenuItem"
Me.신규코드업로드ToolStripMenuItem.Size = New System.Drawing.Size(244, 22)
Me.신규코드업로드ToolStripMenuItem.Text = "신규코드 업로드"
Me.신규코드업로드ToolStripMenuItem.Visible = False
'
'ToolStripMenuItem7
'
Me.ToolStripMenuItem7.Name = "ToolStripMenuItem7"
@@ -326,7 +319,7 @@ Partial Class MdiMain
'
'환경설정ToolStripMenuItem
'
Me.환경설정ToolStripMenuItem.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.실행ToolStripMenuItem, Me.btMacro})
Me.환경설정ToolStripMenuItem.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.실행ToolStripMenuItem, Me.btMacro, Me.btMacro2})
Me.환경설정ToolStripMenuItem.Image = CType(resources.GetObject("환경설정ToolStripMenuItem.Image"), System.Drawing.Image)
Me.환경설정ToolStripMenuItem.Name = "환경설정ToolStripMenuItem"
Me.환경설정ToolStripMenuItem.Size = New System.Drawing.Size(57, 20)
@@ -346,6 +339,14 @@ Partial Class MdiMain
Me.btMacro.Text = "일괄실행"
Me.btMacro.Visible = False
'
'btMacro2
'
Me.btMacro2.ForeColor = System.Drawing.Color.Blue
Me.btMacro2.Name = "btMacro2"
Me.btMacro2.Size = New System.Drawing.Size(124, 22)
Me.btMacro2.Text = "Macro II"
Me.btMacro2.Visible = False
'
'bt_계산결과
'
Me.bt_계산결과.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.계산결과ToolStripMenuItem, Me.bt_인증평가서, Me.업로드양식ToolStripMenuItem})
@@ -696,6 +697,13 @@ Partial Class MdiMain
Me.순실체적ToolStripMenuItem.Size = New System.Drawing.Size(170, 22)
Me.순실체적ToolStripMenuItem.Text = "3.순실체적"
'
'ManualToolStripMenuItem
'
Me.ManualToolStripMenuItem.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right
Me.ManualToolStripMenuItem.Name = "ManualToolStripMenuItem"
Me.ManualToolStripMenuItem.Size = New System.Drawing.Size(59, 20)
Me.ManualToolStripMenuItem.Text = "Manual"
'
'MdiMain
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(7.0!, 12.0!)
@@ -801,7 +809,6 @@ Partial Class MdiMain
Friend WithEvents 데이터비교ToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents 순실체적ToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents 업로드양식ToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents 신규코드업로드ToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents WindowsMenu As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents NewWindowToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents CascadeToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
@@ -821,5 +828,6 @@ Partial Class MdiMain
Friend WithEvents btMacro As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents BatchUpdateProfileToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents btcustomprofile As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents btMacro2 As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents ManualToolStripMenuItem As ToolStripMenuItem
End Class

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,5 @@
Imports System.IO
Imports Eco2Ar.WebServer
Public Class MdiMain
@@ -20,9 +21,17 @@ Public Class MdiMain
'''현재열려있는폼의 이름을 변경한다.
Public OpenedForm As E_MenuIdx = E_MenuIdx.NONE
Private webServer As StaticFileServer
Private Sub MdiMain_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
pLog.Add("FormClosed", True)
' 웹 서버 정리
If webServer IsNot Nothing Then
webServer.Stop()
webServer.Dispose()
End If
End Sub
Private Sub MdiMain_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
@@ -124,6 +133,7 @@ Public Class MdiMain
bt_계산결과.Visible = False
bt_인증평가서.Visible = False
btImport.Visible = False
btMacro.Visible = False
'//서버로부터 사용여부 체크
'If L.Check_guest <> "OK" Then
' MsgBox("일반사용자에게는 아직 오픈되지 않았습니다.", MsgBoxStyle.Information, "확인")
@@ -138,6 +148,7 @@ Public Class MdiMain
'bt_계산결과그래프q.Visible = True
bt_인증평가서.Visible = True
btImport.Visible = True
btMacro.Visible = False
Case "BOTH1"
bt_데이터관리.Visible = True
Me.bt_etc.Visible = False
@@ -147,6 +158,7 @@ Public Class MdiMain
'bt_계산결과그래프q.Visible = True
bt_인증평가서.Visible = True
btImport.Visible = True
btMacro.Visible = False
Case "BOTH2"
bt_데이터관리.Visible = False
Me.bt_etc.Visible = False
@@ -156,6 +168,7 @@ Public Class MdiMain
'bt_계산결과그래프q.Visible = False
bt_인증평가서.Visible = False
btImport.Visible = False
btMacro.Visible = False
Case Else
bt_데이터관리.Visible = False
bt_계산결과그래프.Visible = False
@@ -164,8 +177,11 @@ Public Class MdiMain
bt_계산결과.Visible = False
bt_인증평가서.Visible = False
btImport.Visible = False
btMacro.Visible = False
End Select
btMacro2.Visible = btMacro.Visible
If Prj.UserAuthType_Real.StartsWith("BOTH_C_") Then
btcustomprofile.Visible = True
End If
@@ -236,6 +252,20 @@ Public Class MdiMain
pLog.Add("Program Start")
Try
' 웹 서버 초기화 및 시작
Dim wwwPath = Path.Combine(Application.StartupPath, "wwwroot")
webServer = New StaticFileServer(wwwPath, 58123)
webServer.Start()
'If System.Diagnostics.Debugger.IsAttached Then
' webServer.OpenInBrowser()
'End If
Catch ex As Exception
' 웹 서버 시작 실패해도 프로그램은 계속 실행
Debug.WriteLine("웹 서버 시작 실패: " & ex.Message)
End Try
If Me.bt_etc.Visible = False AndAlso System.Diagnostics.Debugger.IsAttached Then
MsgBox("debugmode import on")
Me.bt_etc.Visible = True
@@ -936,6 +966,9 @@ Public Class MdiMain
DSET1.tbl_profile.AcceptChanges()
Pub.Update_열관류율_140409()
PrjChanged = False
Me.RefreshMenuList("")
@@ -3467,61 +3500,6 @@ ENDSTAT: '//오류발생시 강제종료를 위한 분기문
End Sub
Private Sub 신규코드업로드ToolStripMenuItem_Click(sender As Object, e As EventArgs)
If Prj.Opened Then
Work_msg_timer("열려있는 파일을 닫아야 사용 가능합니다", 10)
Return
End If
If MsgBox("신규파일의 코드를 갱신하시겠습니까?", MsgBoxStyle.Information Or MsgBoxStyle.YesNo, "확인") = MsgBoxResult.Yes Then
'물어야하니 if
Dim new_string As String
If Prj.UserAuthType = "ADMIN" OrElse Prj.UserAuthType = "BOTH" OrElse Prj.UserAuthType = "BOTH2" OrElse Prj.UserAuthType = "BOTH1" Then '//2011.03.09 추가
new_string = "\new"
Else
new_string = "\new1"
End If
Dim Srcfile As New System.IO.FileInfo(My.Application.Info.DirectoryPath & new_string)
Me.Open_File(Srcfile.FullName, True)
End If
End Sub
Private Sub 신규코드업로드ToolStripMenuItem_Click_1(sender As Object, e As EventArgs) Handles 신규코드업로드ToolStripMenuItem.Click
If Prj.Opened Then
Work_msg_timer("열려있는 파일을 닫아주세요", 10)
Return
End If
'물어야하니 if
If MsgBox("새파일소스를 업데이트 하시겠습니까?", MsgBoxStyle.Information Or MsgBoxStyle.OkCancel, "확인") <> MsgBoxResult.Ok Then Return '//ok 안하면 빠져나가기
Dim new_string As String
If Prj.UserAuthType = "ADMIN" OrElse Prj.UserAuthType = "BOTH" OrElse Prj.UserAuthType = "BOTH2" OrElse Prj.UserAuthType = "BOTH1" Then '//2011.03.09 추가
new_string = "\new"
Else
new_string = "\new1"
End If
Dim Srcfile As New System.IO.FileInfo(My.Application.Info.DirectoryPath & new_string)
If Srcfile.Exists = False Then
MsgBox("원본샘플파일이 존재하지않습니다", MsgBoxStyle.Critical, "확인")
Return '//복사할원본이 없으면 빠져나가기
End If
'/////////////////////////////////////////////////////////////////////////////////////////////////////////////저장파일 변조2011.03.16추가
'If Not (Prj.UserAuthType = "ADMIN" OrElse Prj.UserAuthType = "BOTH" OrElse Prj.UserAuthType = "BOTH2" OrElse Prj.UserAuthType = "BOTH1") Then '//2011.03.09 추가
' Dim Desbuf() As Byte = {}
' Dim Source() As Byte = My.Computer.FileSystem.ReadAllBytes(SD.FileName)
' Desbuf = DeCryptArea(Source, New Byte() {&HAC, &H29, &H55, &H42})
' My.Computer.FileSystem.WriteAllBytes(SD.FileName, Desbuf, False)
'End If
'/////////////////////////////////////////////////////////////////////////////////////////////////////////////저장파일 변조2011.03.16추가
Me.Open_File(Srcfile.FullName, True)
End Sub
Private Sub CascadeToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles CascadeToolStripMenuItem.Click
Me.LayoutMdi(MdiLayout.Cascade)
End Sub
@@ -4000,4 +3978,24 @@ ENDSTAT: '//오류발생시 강제종료를 위한 분기문
f.ControlBox = True
f.ShowDialog()
End Sub
Private Sub MacroIIToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles btMacro2.Click
Menu_건물개요()
Dim f As New Frm_Macro2
f.Show()
End Sub
Dim frmManual As Frm_WebManual = Nothing
Private Sub ManualToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ManualToolStripMenuItem.Click
If frmManual Is Nothing OrElse frmManual.IsDisposed Then
frmManual = New Frm_WebManual()
frmManual.Show()
End If
If frmManual.WindowState = FormWindowState.Minimized Then
frmManual.WindowState = FormWindowState.Normal
End If
frmManual.Activate()
End Sub
End Class

View File

@@ -57,6 +57,161 @@
Public DSHistory As New DS2
Public Importsameaddress As Boolean = False
Public Sub Update_열관류율_140409()
DSET1.tbl_yk.AcceptChanges()
For Each DrowYK As DS.tbl_ykRow In DSET1.tbl_yk
If DrowYK.RowState = DataRowState.Deleted OrElse DrowYK.RowState = DataRowState.Detached Then Continue For
Dim R_value As Decimal = 0
Dim width As Decimal = 0
Dim filter As String = "pcode='" + DrowYK.code + "'"
For Each Dr As DS.tbl_ykdetailRow In DSET1.tbl_ykdetail.Select(filter, "")
If Dr.설명 = "공기층" Then
Dr.열전도율 = ""
If TOSG(Dr.두께) > 10.0 Then
Dr.열저항 = TOST(0.086)
R_value += 0.086
Else
Dr.열저항 = TOST(TOSG(Dr.두께) * 0.0086)
R_value = R_value + TOSG(Dr.두께) * 0.0086
End If
Else '//여기아래 추가하신거에요?
If Dr.설명.IndexOf("열전달저항") <> -1 Then
Dr.두께 = ""
Dr.열전도율 = ""
Select Case Dr.설명
Case "실내열전달저항(벽체)"
Dr.열저항 = TOST(0.11)
R_value += 0.11
Case "실외열전달저항(벽체,간접)"
Dr.열저항 = TOST(0.11)
R_value += 0.11
Case "실외열전달저항(벽체,직접)"
Dr.열저항 = TOST(0.043)
R_value += 0.043
Case "실내열전달저항(바닥)"
Dr.열저항 = TOST(0.086)
R_value += 0.086
Case "실외열전달저항(바닥,간접)"
Dr.열저항 = TOST(0.15)
R_value += 0.15
Case "실외열전달저항(바닥,직접)"
Dr.열저항 = TOST(0.043)
R_value += 0.043
Case "실내열전달저항(지붕)"
Dr.열저항 = TOST(0.086)
R_value += 0.086
Case "실외열전달저항(지붕,간접)"
Dr.열저항 = TOST(0.086)
R_value += 0.086
Case "실외열전달저항(지붕,직접)"
Dr.열저항 = TOST(0.043)
R_value += 0.043
End Select
Else
If Dr.열전도율 <> "" AndAlso TOSG(Dr.열전도율) <> 0 Then
Dr.열저항 = TOSG(Math.Round(TOSG(Dr.두께) / 1000 / TOSG(Dr.열전도율), 4)).ToString
R_value += TOSG(Dr.열저항) '//여부분에서는 나올수잇겟군요.?예
End If
End If
End If
If Dr.설명.IndexOf("열전달저항") = -1 Then
width += TOSG(Dr.두께)
End If
Next
Try
If DrowYK.면형태 = "0" Then
DrowYK.열관류율 = CSng(Math.Round(1 / R_value, 3)).ToString
DrowYK.투과율 = ""
Else
Dim 면형태 As DS.tbl_commonRow = DSET1.tbl_common.Select("gubun='1088' and code='" + DrowYK.면형태 + "'")(0)
If 면형태.name = "외부창" OrElse 면형태.name = "내부창" Then
If DrowYK.발코니창호여부 Then
DrowYK.열관류율 = Math.Round((1 / ((1 / TOSG(DrowYK.창호열관류율)) + (1 / TOSG(DrowYK.발코니창호열관류율)) * 0.5)), 3)
DrowYK.투과율 = Math.Round(TOSG(DrowYK.발코니투과율) * TOSG(DrowYK.일사에너지투과율), 3)
Else
DrowYK.열관류율 = DrowYK.창호열관류율
DrowYK.투과율 = DrowYK.일사에너지투과율
End If
Else
DrowYK.열관류율 = CSng(Math.Round(1 / R_value, 3)).ToString
DrowYK.투과율 = ""
End If
End If
Catch ex As Exception
DrowYK.열관류율 = ""
DrowYK.투과율 = ""
End Try
Next
'//열관류율이 링크된 모든면의 건축부위 데이터를 열관류율 화면의 건축부위 데이터로 갱신
For Each Drow As DS.tbl_myounRow In DSET1.tbl_myoun
If Drow.RowState = DataRowState.Deleted OrElse Drow.RowState = DataRowState.Detached Then Continue For
#If DEBUG Then
If Drow.code = "0009" Then
MsgBox("test")
End If
#End If
If Drow.열관류율2 <> "0" Then
Try '==========================================2014.04.17 열관류율 삭제시 코드번호가 남아 오류 발생하는 현상을 try 안으로 넣음
Dim Dr As DS.tbl_ykRow = DSET1.tbl_yk.Select("code='" & Drow.열관류율2.ToString & "'")(0)
Drow.건축부위방식 = Dr.면형태 '// 링크된 열관류율에서 면형태를 가져옴..
Select Case Dr.면형태
Case "외벽(벽체)", "0"
Drow.건축부위방식 = "외벽"
Case "외벽(지붕)", "0001"
Drow.건축부위방식 = "외벽"
'Drow.방위 = "수평"
Case "외벽(바닥)", "0002"
Drow.건축부위방식 = "외벽"
'Drow.방위 = "일사없음"
Case "내벽(벽체)", "0003", "지중벽", "0009"
Drow.건축부위방식 = "내벽"
Drow.방위 = "일사없음"
Case "내벽(지붕)", "0004"
Drow.건축부위방식 = "내벽"
Drow.방위 = "일사없음"
Case "내벽(바닥)", "0005"
Drow.건축부위방식 = "내벽"
Drow.방위 = "일사없음"
Case "간벽", "0006"
Drow.건축부위방식 = "간벽"
Drow.방위 = "일사없음"
Case "외부창", "0007"
Drow.건축부위방식 = "외부창"
'Drow.투과율 = Dr.일사에너지투과율
Case "내부창", "0008"
Drow.건축부위방식 = "내부창"
'Drow.투과율 = Dr.일사에너지투과율
Case Else
MsgBox("모르는값 " & Dr("면형태").ToString & "/" & Dr.면형태)
End Select
Catch ex As Exception
End Try
End If
Next
End Sub
Public Function 프로필급탕요구량(면적별범위 As Char) As Decimal
'Drow프로필.일일급탕요구량()

View File

@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
' 지정되도록 할 수 있습니다.
' <Assembly: AssemblyVersion("1.0.*")>
<Assembly: AssemblyVersion("1.2017.0122.1009")>
<Assembly: AssemblyFileVersion("1.2017.0122.1009")>
<Assembly: AssemblyVersion("1.2017.0122.1014")>
<Assembly: AssemblyFileVersion("1.2017.0122.1014")>

View File

@@ -0,0 +1,244 @@
' OWIN 정적 파일 호스팅 서버 사용 예제
'
' 이 파일은 StaticFileServer를 사용하는 방법을 보여줍니다.
' 실제 사용 시에는 MdiMain.vb 또는 필요한 폼에서 사용하세요.
Imports Eco2Ar.WebServer
Imports System.IO
Namespace Examples
''' <summary>
''' 웹 서버 사용 예제
''' </summary>
Public Class WebServerExample
Private server As StaticFileServer
''' <summary>
''' 예제 1: 기본 사용법
''' </summary>
Public Sub Example1_BasicUsage()
' 1. 정적 파일을 서빙할 디렉토리 경로 설정
Dim wwwrootPath As String = Path.Combine(Application.StartupPath, "wwwroot")
' 2. 서버 인스턴스 생성 (포트 58123 사용)
server = New StaticFileServer(wwwrootPath, 58123)
' 3. 서버 시작
server.Start()
' 4. 브라우저에서 열기 (선택사항)
' server.OpenInBrowser()
MsgBox("웹 서버가 시작되었습니다." & vbCrLf & _
"URL: " & server.BaseUrl & vbCrLf & _
"루트 경로: " & server.RootPath, _
MsgBoxStyle.Information, "웹 서버")
End Sub
''' <summary>
''' 예제 2: MdiMain에서 사용 (프로그램 시작 시 서버 시작)
''' </summary>
Public Sub Example2_IntegrationWithMdiMain()
' MdiMain.vb의 MdiMain_Load 이벤트에 추가:
'
' Private webServer As StaticFileServer
'
' Private Sub MdiMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' ' ... 기존 코드 ...
'
' Try
' ' 웹 서버 초기화 및 시작
' Dim wwwPath = Path.Combine(Application.StartupPath, "wwwroot")
' webServer = New StaticFileServer(wwwPath)
' webServer.Start()
' Catch ex As Exception
' ' 웹 서버 시작 실패해도 프로그램은 계속 실행
' Debug.WriteLine("웹 서버 시작 실패: " & ex.Message)
' End Try
' End Sub
'
' Private Sub MdiMain_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
' ' ... 기존 코드 ...
'
' ' 웹 서버 정리
' If webServer IsNot Nothing Then
' webServer.Stop()
' webServer.Dispose()
' End If
' End Sub
End Sub
''' <summary>
''' 예제 3: 특정 파일 브라우저에서 열기
''' </summary>
Public Sub Example3_OpenSpecificFile()
If server Is Nothing OrElse Not server.IsRunning Then
MsgBox("서버가 실행 중이 아닙니다.", MsgBoxStyle.Exclamation, "오류")
Return
End If
' 리포트 HTML 파일 열기
server.OpenFileInBrowser("report.html")
' 또는 URL만 가져오기
Dim reportUrl As String = server.GetFileUrl("reports/2025/report.html")
MsgBox("리포트 URL: " & reportUrl, MsgBoxStyle.Information, "URL")
End Sub
''' <summary>
''' 예제 4: 동적으로 HTML 파일 생성 후 표시
''' </summary>
Public Sub Example4_GenerateAndDisplay()
If server Is Nothing OrElse Not server.IsRunning Then
MsgBox("서버가 실행 중이 아닙니다.", MsgBoxStyle.Exclamation, "오류")
Return
End If
' HTML 파일 생성
Dim htmlContent As String = "<!DOCTYPE html>" & vbCrLf & _
"<html>" & vbCrLf & _
"<head>" & vbCrLf & _
" <meta charset=""utf-8"">" & vbCrLf & _
" <title>ECO2 리포트</title>" & vbCrLf & _
" <style>" & vbCrLf & _
" body { font-family: 'Malgun Gothic', sans-serif; margin: 20px; }" & vbCrLf & _
" h1 { color: #2c3e50; }" & vbCrLf & _
" table { border-collapse: collapse; width: 100%; }" & vbCrLf & _
" th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }" & vbCrLf & _
" th { background-color: #4CAF50; color: white; }" & vbCrLf & _
" </style>" & vbCrLf & _
"</head>" & vbCrLf & _
"<body>" & vbCrLf & _
" <h1>건물 에너지 분석 리포트</h1>" & vbCrLf & _
" <table>" & vbCrLf & _
" <tr><th>항목</th><th>값</th></tr>" & vbCrLf & _
" <tr><td>1차 에너지 소요량</td><td>123.45 kWh/m²·year</td></tr>" & vbCrLf & _
" <tr><td>CO2 배출량</td><td>45.67 kg/m²·year</td></tr>" & vbCrLf & _
" </table>" & vbCrLf & _
"</body>" & vbCrLf & _
"</html>"
' 파일 저장
Dim reportPath As String = Path.Combine(server.RootPath, "report.html")
File.WriteAllText(reportPath, htmlContent, System.Text.Encoding.UTF8)
' 브라우저에서 열기
server.OpenFileInBrowser("report.html")
End Sub
''' <summary>
''' 예제 5: 폼 버튼에서 웹 리포트 생성 및 표시
''' </summary>
Public Sub Example5_ButtonClick()
' 폼의 버튼 클릭 이벤트에 추가:
'
' Private Sub btnShowWebReport_Click(sender As Object, e As EventArgs) Handles btnShowWebReport.Click
' Try
' ' 서버가 실행 중이 아니면 시작
' If webServer Is Nothing OrElse Not webServer.IsRunning Then
' Dim wwwPath = Path.Combine(Application.StartupPath, "wwwroot")
' webServer = New StaticFileServer(wwwPath)
' webServer.Start()
' End If
'
' ' HTML 리포트 생성
' GenerateHtmlReport()
'
' ' 브라우저에서 열기
' webServer.OpenFileInBrowser("report.html")
' Catch ex As Exception
' MsgBox("리포트 생성 실패: " & ex.Message, MsgBoxStyle.Critical, "오류")
' End Try
' End Sub
'
' Private Sub GenerateHtmlReport()
' ' 실제 데이터를 사용하여 HTML 생성
' Dim html As String = BuildHtmlReport(DSET1, DSETR1, Result2)
' Dim path As String = Path.Combine(webServer.RootPath, "report.html")
' File.WriteAllText(path, html, System.Text.Encoding.UTF8)
' End Sub
End Sub
''' <summary>
''' 서버 중지
''' </summary>
Public Sub StopServer()
If server IsNot Nothing Then
server.Stop()
server.Dispose()
server = Nothing
End If
End Sub
End Class
''' <summary>
''' 간단한 HTML 빌더 헬퍼 클래스
''' </summary>
Public Class HtmlReportBuilder
Private html As System.Text.StringBuilder
Public Sub New(title As String)
html = New System.Text.StringBuilder()
html.AppendLine("<!DOCTYPE html>")
html.AppendLine("<html>")
html.AppendLine("<head>")
html.AppendLine(" <meta charset=""utf-8"">")
html.AppendLine(" <title>" & title & "</title>")
html.AppendLine(" <style>")
html.AppendLine(" body { font-family: 'Malgun Gothic', sans-serif; margin: 20px; }")
html.AppendLine(" h1 { color: #2c3e50; }")
html.AppendLine(" h2 { color: #34495e; border-bottom: 2px solid #3498db; padding-bottom: 5px; }")
html.AppendLine(" table { border-collapse: collapse; width: 100%; margin: 20px 0; }")
html.AppendLine(" th, td { border: 1px solid #ddd; padding: 12px; text-align: left; }")
html.AppendLine(" th { background-color: #4CAF50; color: white; }")
html.AppendLine(" tr:nth-child(even) { background-color: #f2f2f2; }")
html.AppendLine(" .section { margin: 30px 0; }")
html.AppendLine(" </style>")
html.AppendLine("</head>")
html.AppendLine("<body>")
html.AppendLine(" <h1>" & title & "</h1>")
End Sub
Public Sub AddSection(sectionTitle As String)
html.AppendLine(" <div class=""section"">")
html.AppendLine(" <h2>" & sectionTitle & "</h2>")
End Sub
Public Sub StartTable(ParamArray headers As String())
html.AppendLine(" <table>")
html.Append(" <tr>")
For Each headerItem As String In headers
html.Append("<th>" & headerItem & "</th>")
Next
html.AppendLine("</tr>")
End Sub
Public Sub AddRow(ParamArray cells As String())
html.Append(" <tr>")
For Each cellItem As String In cells
html.Append("<td>" & cellItem & "</td>")
Next
html.AppendLine("</tr>")
End Sub
Public Sub EndTable()
html.AppendLine(" </table>")
End Sub
Public Sub EndSection()
html.AppendLine(" </div>")
End Sub
Public Function Build() As String
html.AppendLine("</body>")
html.AppendLine("</html>")
Return html.ToString()
End Function
End Class
End Namespace

View File

@@ -0,0 +1,50 @@
=====================================================
OWIN 정적 파일 호스팅 서버 설치 가이드
=====================================================
1. Visual Studio에서 ECO2_2025V1 프로젝트 열기
2. 메뉴: 도구 > NuGet 패키지 관리자 > 패키지 관리자 콘솔
3. 다음 명령들을 순서대로 실행:
Install-Package Owin -Version 1.0
Install-Package Microsoft.Owin -Version 2.1.0
Install-Package Microsoft.Owin.Host.HttpListener -Version 2.1.0
Install-Package Microsoft.Owin.Hosting -Version 2.1.0
Install-Package Microsoft.Owin.StaticFiles -Version 2.1.0
4. 프로젝트 다시 빌드
5. wwwroot 폴더 생성 (없는 경우):
- 출력 디렉토리에 wwwroot 폴더 생성
- Debug: ..\..\..\..\..\eco2\debug_2016\wwwroot
- Release: c:\eco2\debug_2016\wwwroot
6. 기본 index.html 생성 (선택사항):
wwwroot\index.html 파일에 다음 내용 추가:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ECO2 Web Server</title>
</head>
<body>
<h1>ECO2 웹 서버가 정상 작동 중입니다</h1>
</body>
</html>
7. 사용 예제는 Example_WebServer_Usage.vb 참고
8. 관리자 권한 필요 시 (선택사항):
관리자 권한 명령 프롬프트에서:
netsh http add urlacl url=http://+:58123/ user=Everyone
=====================================================
문제 발생 시:
- README.md의 "문제 해결" 섹션 참고
- 패키지 버전이 정확한지 확인 (2.1.0)
- .NET Framework 4.0 타겟이 맞는지 확인
=====================================================

View File

@@ -0,0 +1,126 @@
# Visual Studio 2010 수동 설치 가이드
VS2010에는 NuGet이 기본 내장되어 있지 않으므로, 두 가지 방법 중 선택할 수 있습니다.
## 방법 1: NuGet Extension 설치 (권장)
1. Visual Studio 2010 열기
2. **도구** > **확장 관리자** 클릭
3. **온라인 갤러리** 선택
4. 검색창에 "NuGet Package Manager" 입력
5. **NuGet Package Manager** 찾아서 **다운로드** 클릭
6. 설치 후 Visual Studio 재시작
7. 이후 README.md의 NuGet 설치 방법 따라하기
또는 직접 다운로드:
https://visualstudiogallery.msdn.microsoft.com/27077b70-9dad-4c64-adcf-c7cf6bc9970c
## 방법 2: DLL 수동 추가 (NuGet 없이)
### 1단계: 필요한 DLL 다운로드
다음 NuGet 패키지를 직접 다운로드:
**다운로드 링크:**
- https://www.nuget.org/packages/Owin/1.0
- https://www.nuget.org/packages/Microsoft.Owin/2.1.0
- https://www.nuget.org/packages/Microsoft.Owin.Host.HttpListener/2.1.0
- https://www.nuget.org/packages/Microsoft.Owin.Hosting/2.1.0
- https://www.nuget.org/packages/Microsoft.Owin.StaticFiles/2.1.0
- https://www.nuget.org/packages/Microsoft.Owin.FileSystems/2.1.0
각 페이지에서 "Download package" 클릭
### 2단계: NuGet 패키지에서 DLL 추출
1. 다운로드한 `.nupkg` 파일의 확장자를 `.zip`으로 변경
2. 압축 해제
3. `lib\net40\` 폴더에서 DLL 파일 찾기
4. 프로젝트 폴더에 `lib` 디렉토리 생성
5. 모든 DLL을 `S:\Source\KICT\ECO2\lib\` 폴더에 복사
**필요한 DLL 목록:**
- Owin.dll
- Microsoft.Owin.dll
- Microsoft.Owin.Host.HttpListener.dll
- Microsoft.Owin.Hosting.dll
- Microsoft.Owin.StaticFiles.dll
- Microsoft.Owin.FileSystems.dll
### 3단계: Visual Studio 프로젝트에 참조 추가
1. 솔루션 탐색기에서 **ECO2_2025V1** 프로젝트 선택
2. **참조** 폴더 우클릭 > **참조 추가**
3. **찾아보기** 탭 선택
4. `S:\Source\KICT\ECO2\lib\` 폴더로 이동
5. 위의 모든 DLL 선택하여 추가
### 4단계: app.config에 바인딩 리디렉션 추가
`ArinWarev1\app.config` 파일을 열고 `</configuration>` 바로 앞에 추가:
```xml
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.1.0.0" newVersion="2.1.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
```
## 방법 3: 스크립트로 자동 다운로드 (PowerShell)
프로젝트 루트에서 PowerShell 실행:
```powershell
# lib 폴더 생성
New-Item -ItemType Directory -Force -Path "lib"
# NuGet.exe 다운로드
Invoke-WebRequest -Uri "https://dist.nuget.org/win-x86-commandline/v2.8.6/nuget.exe" -OutFile "nuget.exe"
# 패키지 다운로드
.\nuget.exe install Owin -Version 1.0 -OutputDirectory packages
.\nuget.exe install Microsoft.Owin -Version 2.1.0 -OutputDirectory packages
.\nuget.exe install Microsoft.Owin.Host.HttpListener -Version 2.1.0 -OutputDirectory packages
.\nuget.exe install Microsoft.Owin.Hosting -Version 2.1.0 -OutputDirectory packages
.\nuget.exe install Microsoft.Owin.StaticFiles -Version 2.1.0 -OutputDirectory packages
# DLL 복사
Copy-Item "packages\Owin.1.0\lib\net40\Owin.dll" -Destination "lib\"
Copy-Item "packages\Microsoft.Owin.2.1.0\lib\net40\Microsoft.Owin.dll" -Destination "lib\"
Copy-Item "packages\Microsoft.Owin.Host.HttpListener.2.1.0\lib\net40\Microsoft.Owin.Host.HttpListener.dll" -Destination "lib\"
Copy-Item "packages\Microsoft.Owin.Hosting.2.1.0\lib\net40\Microsoft.Owin.Hosting.dll" -Destination "lib\"
Copy-Item "packages\Microsoft.Owin.StaticFiles.2.1.0\lib\net40\Microsoft.Owin.StaticFiles.dll" -Destination "lib\"
Copy-Item "packages\Microsoft.Owin.FileSystems.2.1.0\lib\net40\Microsoft.Owin.FileSystems.dll" -Destination "lib\"
Write-Host "DLL 다운로드 완료! lib 폴더를 확인하세요."
```
## 방법 4: 미리 준비된 DLL 사용
팀원에게 이미 설치된 환경에서 다음 폴더의 DLL을 복사 받기:
- `packages\Owin.1.0\lib\net40\`
- `packages\Microsoft.Owin.2.1.0\lib\net40\`
- `packages\Microsoft.Owin.Host.HttpListener.2.1.0\lib\net40\`
- `packages\Microsoft.Owin.Hosting.2.1.0\lib\net40\`
- `packages\Microsoft.Owin.StaticFiles.2.1.0\lib\net40\`
- `packages\Microsoft.Owin.FileSystems.2.1.0\lib\net40\`
## 확인 방법
프로젝트를 빌드했을 때 다음 오류가 없으면 성공:
- "형식 또는 네임스페이스 이름 'Owin'을 찾을 수 없습니다"
- "형식 또는 네임스페이스 이름 'Microsoft'을 찾을 수 없습니다"
## 문제 해결
### "Could not load file or assembly" 오류
- app.config에 바인딩 리디렉션 추가했는지 확인
- DLL 버전이 2.1.0이 맞는지 확인 (2.x 버전만 .NET 4.0 호환)
### "파일을 찾을 수 없습니다" 오류
- 출력 디렉토리에 DLL이 복사되는지 확인
- 참조의 "로컬 복사" 속성이 True인지 확인

View File

@@ -0,0 +1,190 @@
# OWIN 정적 파일 호스팅 서버
ECO2 프로젝트에 OWIN 기반 내장 웹 서버를 추가하여 HTML 리포트 및 정적 파일을 호스팅할 수 있습니다.
## 설치 방법
### 1. NuGet 패키지 설치
Visual Studio에서 Package Manager Console을 열고 다음 명령을 실행하세요:
```powershell
# ECO2_2025V1 프로젝트를 기본 프로젝트로 선택 후 실행
Install-Package Microsoft.Owin -Version 2.1.0
Install-Package Microsoft.Owin.Host.HttpListener -Version 2.1.0
Install-Package Microsoft.Owin.Hosting -Version 2.1.0
Install-Package Microsoft.Owin.StaticFiles -Version 2.1.0
Install-Package Owin -Version 1.0
```
또는 패키지 관리자 UI에서 다음 패키지를 검색하여 설치:
- Microsoft.Owin (2.1.0)
- Microsoft.Owin.Host.HttpListener (2.1.0)
- Microsoft.Owin.Hosting (2.1.0)
- Microsoft.Owin.StaticFiles (2.1.0)
- Owin (1.0)
### 2. 프로젝트에 파일 추가
다음 파일들이 `WebServer` 폴더에 추가되었습니다:
- `StaticFileServer.vb` - 메인 서버 클래스
- `Startup.vb` - OWIN 시작 구성
- `Example_WebServer_Usage.vb` - 사용 예제
Visual Studio에서 프로젝트를 다시 로드하면 자동으로 인식됩니다.
## 사용 방법
### 기본 사용법
```vb
Imports Eco2Ar.WebServer
Imports System.IO
' 1. 서버 인스턴스 생성
Dim wwwrootPath As String = Path.Combine(Application.StartupPath, "wwwroot")
Dim server As New StaticFileServer(wwwrootPath, 58123)
' 2. 서버 시작
server.Start()
' 3. 브라우저에서 열기
server.OpenInBrowser()
' 4. 사용 후 서버 중지
server.Stop()
```
### MdiMain에 통합
`MdiMain.vb`에 다음 코드를 추가:
```vb
Public Class MdiMain
Private webServer As StaticFileServer
Private Sub MdiMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' ... 기존 코드 ...
' 웹 서버 시작
Try
Dim wwwPath = Path.Combine(Application.StartupPath, "wwwroot")
webServer = New StaticFileServer(wwwPath)
webServer.Start()
Catch ex As Exception
Debug.WriteLine("웹 서버 시작 실패: " & ex.Message)
End Try
End Sub
Private Sub MdiMain_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
' ... 기존 코드 ...
' 웹 서버 정리
If webServer IsNot Nothing Then
webServer.Stop()
webServer.Dispose()
End If
End Sub
End Class
```
### HTML 리포트 생성 및 표시
```vb
' HTML 리포트 빌더 사용
Dim builder As New HtmlReportBuilder("건물 에너지 분석 리포트")
builder.AddSection("1차 에너지 소요량")
builder.StartTable("항목", "값", "단위")
builder.AddRow("난방", "123.45", "kWh/m²·year")
builder.AddRow("냉방", "67.89", "kWh/m²·year")
builder.EndTable()
builder.EndSection()
Dim html As String = builder.Build()
' 파일 저장
Dim reportPath As String = Path.Combine(webServer.RootPath, "report.html")
File.WriteAllText(reportPath, html, System.Text.Encoding.UTF8)
' 브라우저에서 열기
webServer.OpenFileInBrowser("report.html")
```
## 폴더 구조
```
C:\eco2\debug_2016\
├─ Eco2Ar.exe
└─ wwwroot\ # 정적 파일 루트 디렉토리
├─ index.html # 기본 페이지
├─ report.html # 생성된 리포트
├─ css\
│ └─ styles.css
├─ js\
│ └─ scripts.js
└─ images\
└─ logo.png
```
## 주요 기능
### StaticFileServer 클래스
- **Start()** - 웹 서버 시작
- **Stop()** - 웹 서버 중지
- **OpenInBrowser()** - 기본 브라우저에서 루트 URL 열기
- **OpenFileInBrowser(relativePath)** - 특정 파일을 브라우저에서 열기
- **GetFileUrl(relativePath)** - 파일의 전체 URL 반환
- **IsRunning** - 서버 실행 상태 확인
- **BaseUrl** - 서버 URL (http://localhost:58123)
- **RootPath** - 정적 파일 루트 경로
### HtmlReportBuilder 클래스
간단한 HTML 리포트를 코드로 생성할 수 있는 헬퍼 클래스입니다.
## 포트 정보
- **기본 포트**: 58123 (일반적으로 사용하지 않는 포트)
- 필요 시 생성자에서 다른 포트 지정 가능: `New StaticFileServer(path, 9999)`
## 보안 주의사항
- 이 웹 서버는 **localhost**에서만 접근 가능합니다 (외부 접근 불가)
- 민감한 정보를 wwwroot에 저장하지 마세요
- 필요한 경우에만 서버를 실행하고 사용 후 중지하세요
## 문제 해결
### "포트가 이미 사용 중입니다" 오류
다른 프로그램이 58123 포트를 사용 중일 수 있습니다. 다른 포트를 사용하세요:
```vb
Dim server As New StaticFileServer(wwwrootPath, 58124)
```
### "관리자 권한이 필요합니다" 오류
일부 환경에서는 HTTP.sys 리스너 등록에 관리자 권한이 필요할 수 있습니다.
다음 명령을 관리자 권한 명령 프롬프트에서 실행:
```cmd
netsh http add urlacl url=http://+:58123/ user=Everyone
```
### 패키지 설치 오류
.NET Framework 4.0 타겟 프로젝트이므로 반드시 2.x 버전의 OWIN 패키지를 사용해야 합니다.
최신 버전(4.x)은 .NET Framework 4.5 이상이 필요합니다.
## 예제 코드 위치
더 자세한 사용 예제는 `Example_WebServer_Usage.vb` 파일을 참고하세요.
## 참고 자료
- [OWIN 공식 문서](http://owin.org/)
- [Microsoft.Owin 문서](https://docs.microsoft.com/en-us/aspnet/aspnet/overview/owin-and-katana/)

View File

@@ -0,0 +1,93 @@
' OWIN Startup 클래스
Imports Owin
Imports Microsoft.Owin.StaticFiles
Imports Microsoft.Owin.FileSystems
Namespace WebServer
''' <summary>
''' OWIN 시작 구성 클래스
''' </summary>
Public Class Startup
' 정적 필드로 RootPath 저장
Public Shared RootPath As String = String.Empty
''' <summary>
''' OWIN 미들웨어 구성
''' </summary>
''' <param name="app">App builder</param>
Public Sub Configuration(app As IAppBuilder)
' 루트 경로 확인
If String.IsNullOrEmpty(RootPath) Then
RootPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot")
End If
' 정적 파일 서빙을 위한 파일 시스템 설정
Dim fileSystem = New PhysicalFileSystem(RootPath)
' 정적 파일 옵션 설정
Dim options As New FileServerOptions() With {
.RequestPath = New Microsoft.Owin.PathString(""),
.FileSystem = fileSystem,
.EnableDirectoryBrowsing = False
}
' MIME 타입 매핑 추가 (필요한 경우)
options.StaticFileOptions.ContentTypeProvider = New CustomContentTypeProvider()
' 정적 파일 미들웨어 사용
app.UseFileServer(options)
' 기본 핸들러 (루트 경로 접근 시)
app.Run(Function(context)
' 루트 경로 접근 시 index.html로 리다이렉트
If context.Request.Path.Value = "/" OrElse context.Request.Path.Value = "" Then
Dim indexPath = System.IO.Path.Combine(RootPath, "index.html")
If System.IO.File.Exists(indexPath) Then
context.Response.Redirect("/index.html")
Else
context.Response.StatusCode = 200
context.Response.ContentType = "text/html"
Dim tcs = New System.Threading.Tasks.TaskCompletionSource(Of Integer)()
context.Response.WriteAsync("<html><body><h1>ECO2 Web Server</h1><p>서버가 정상적으로 실행 중입니다.</p><p>루트 경로: " & RootPath & "</p></body></html>")
tcs.SetResult(0)
Return tcs.Task
End If
End If
Dim tcs2 = New System.Threading.Tasks.TaskCompletionSource(Of Integer)()
tcs2.SetResult(0)
Return tcs2.Task
End Function)
End Sub
End Class
''' <summary>
''' 커스텀 Content Type Provider
''' </summary>
Public Class CustomContentTypeProvider
Inherits Microsoft.Owin.StaticFiles.ContentTypes.FileExtensionContentTypeProvider
Public Sub New()
MyBase.New()
' 추가 MIME 타입 매핑 (필요한 경우)
' 기본적으로 일반적인 타입들은 이미 포함되어 있음
If Not Me.Mappings.ContainsKey(".json") Then
Me.Mappings.Add(".json", "application/json")
End If
If Not Me.Mappings.ContainsKey(".svg") Then
Me.Mappings.Add(".svg", "image/svg+xml")
End If
If Not Me.Mappings.ContainsKey(".woff") Then
Me.Mappings.Add(".woff", "font/woff")
End If
If Not Me.Mappings.ContainsKey(".woff2") Then
Me.Mappings.Add(".woff2", "font/woff2")
End If
End Sub
End Class
End Namespace

View File

@@ -0,0 +1,175 @@
' OWIN 기반 정적 파일 호스팅 서버
'
' 사용 방법:
' Dim server As New StaticFileServer("C:\wwwroot", 58123)
' server.Start()
' ... 프로그램 실행 ...
' server.Stop()
Imports System
Imports System.IO
Imports Microsoft.Owin.Hosting
Namespace WebServer
''' <summary>
''' OWIN 기반 정적 파일 호스팅 서버
''' 포트 58123 사용 (일반적으로 사용하지 않는 포트)
''' </summary>
Public Class StaticFileServer
Implements IDisposable
Private _webApp As IDisposable
Private _baseUrl As String
Private _rootPath As String
Private _isRunning As Boolean = False
''' <summary>
''' 서버가 실행 중인지 여부
''' </summary>
Public ReadOnly Property IsRunning As Boolean
Get
Return _isRunning
End Get
End Property
''' <summary>
''' 서버 URL (예: http://localhost:58123)
''' </summary>
Public ReadOnly Property BaseUrl As String
Get
Return _baseUrl
End Get
End Property
''' <summary>
''' 정적 파일 루트 경로
''' </summary>
Public ReadOnly Property RootPath As String
Get
Return _rootPath
End Get
End Property
''' <summary>
''' StaticFileServer 생성자
''' </summary>
''' <param name="rootPath">정적 파일을 서빙할 루트 디렉토리 경로</param>
''' <param name="port">사용할 포트 번호 (기본값: 58123)</param>
Public Sub New(rootPath As String, Optional port As Integer = 58123)
If String.IsNullOrEmpty(rootPath) Then
Throw New ArgumentException("rootPath는 비어있을 수 없습니다.", "rootPath")
End If
If Not Directory.Exists(rootPath) Then
Directory.CreateDirectory(rootPath)
End If
_rootPath = Path.GetFullPath(rootPath)
_baseUrl = String.Format("http://localhost:{0}", port)
End Sub
''' <summary>
''' 웹 서버 시작
''' </summary>
Public Sub Start()
If _isRunning Then
Throw New InvalidOperationException("서버가 이미 실행 중입니다.")
End If
Try
' OWIN 서버 시작
_webApp = WebApp.Start(Of Startup)(_baseUrl)
_isRunning = True
' 루트 경로를 Startup에서 접근할 수 있도록 설정
Startup.RootPath = _rootPath
Console.WriteLine("웹 서버 시작: {0}", _baseUrl)
Console.WriteLine("루트 경로: {0}", _rootPath)
Catch ex As Exception
_isRunning = False
Throw New Exception("웹 서버 시작 실패: " & ex.Message, ex)
End Try
End Sub
''' <summary>
''' 웹 서버 중지
''' </summary>
Public Sub [Stop]()
If Not _isRunning Then
Return
End If
Try
If _webApp IsNot Nothing Then
_webApp.Dispose()
_webApp = Nothing
End If
_isRunning = False
Console.WriteLine("웹 서버 중지됨")
Catch ex As Exception
Throw New Exception("웹 서버 중지 실패: " & ex.Message, ex)
End Try
End Sub
''' <summary>
''' 리소스 해제
''' </summary>
Public Sub Dispose() Implements IDisposable.Dispose
[Stop]()
End Sub
''' <summary>
''' 특정 파일의 전체 URL 반환
''' </summary>
''' <param name="relativePath">상대 경로 (예: "index.html" 또는 "images/logo.png")</param>
''' <returns>전체 URL</returns>
Public Function GetFileUrl(relativePath As String) As String
If String.IsNullOrEmpty(relativePath) Then
Return _baseUrl & "/"
End If
' 경로 정규화
Dim normalizedPath As String = relativePath.Replace("\", "/")
If Not normalizedPath.StartsWith("/") Then
normalizedPath = "/" & normalizedPath
End If
Return _baseUrl & normalizedPath
End Function
''' <summary>
''' 브라우저에서 루트 URL 열기
''' </summary>
Public Sub OpenInBrowser()
If Not _isRunning Then
Throw New InvalidOperationException("서버가 실행 중이 아닙니다.")
End If
Try
System.Diagnostics.Process.Start(_baseUrl)
Catch ex As Exception
Throw New Exception("브라우저 열기 실패: " & ex.Message, ex)
End Try
End Sub
''' <summary>
''' 특정 파일을 브라우저에서 열기
''' </summary>
''' <param name="relativePath">상대 경로</param>
Public Sub OpenFileInBrowser(relativePath As String)
If Not _isRunning Then
Throw New InvalidOperationException("서버가 실행 중이 아닙니다.")
End If
Try
Dim url As String = GetFileUrl(relativePath)
System.Diagnostics.Process.Start(url)
Catch ex As Exception
Throw New Exception("브라우저 열기 실패: " & ex.Message, ex)
End Try
End Sub
End Class
End Namespace

View File

@@ -29,7 +29,7 @@
<!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
</sharedListeners>
</system.diagnostics>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup><userSettings>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/></startup><userSettings>
<Eco2Ar.My.MySettings>
<setting name="xmlformat" serializeAs="String">
<value>&lt;?xml version="1.0" standalone="yes"?&gt;

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.Owin" version="2.1.0" targetFramework="net40" />
<package id="Microsoft.Owin.Host.HttpListener" version="2.1.0" targetFramework="net40" />
<package id="Microsoft.Owin.Hosting" version="2.1.0" targetFramework="net40" />
<package id="Microsoft.Owin.StaticFiles" version="2.1.0" targetFramework="net40" />
<package id="Microsoft.Web.WebView2" version="1.0.3537.50" targetFramework="net48" />
<package id="Owin" version="1.0" targetFramework="net40" />
</packages>

View File

@@ -36,7 +36,7 @@
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">

View File

@@ -25,4 +25,4 @@
<!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
</sharedListeners>
</system.diagnostics>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/></startup></configuration>

381
CLAUDE.md Normal file
View File

@@ -0,0 +1,381 @@
# CLAUDE.md
이 파일은 Claude Code (claude.ai/code)가 이 저장소에서 작업할 때 참고할 가이드를 제공합니다.
## 프로젝트 개요
**ECO2 (Energy Calculation Optimization 2)**는 한국 건축물 에너지효율등급 인증 기준(녹색건축인증)에 따라 건물의 1차 에너지 소요량, CO2 배출량, 신재생에너지 생산량을 계산하는 VB.NET 및 WinForms 기반 응용 프로그램입니다.
**주 언어**: Visual Basic .NET (VB.NET) with .NET Framework 4.0
**추가 언어**: C# (유틸리티 라이브러리만)
**플랫폼**: Windows 데스크톱 응용 프로그램 (x86 타겟)
## 솔루션 구조
솔루션 `ArinWareT4.sln`은 모듈화된 아키텍처로 구성된 6개의 프로젝트를 포함합니다:
### 메인 응용 프로그램
- **ECO2_2025V1** (`ArinWarev1/`) - 주 WinForms 응용 프로그램
- 진입점: `MdiMain.vb` - 메뉴 시스템을 갖춘 MDI 부모 폼
- `Calculator/` 하위 디렉토리의 핵심 계산 엔진
- 기능별 폼 구성: `Forms/`, `Forms_Input/`, `Forms_Report/`, `Forms_Basic/`
- `Data/`의 기상 데이터 (XML 형식)
- 타입 데이터셋: `eco2DataSet.xsd` (데이터 모델링용)
### 지원 라이브러리 (SubProject 폴더 그룹)
- **CEnergy** (`CEnergy/ArinClassV2/`) - 핵심 비즈니스 로직 라이브러리
- 공통 유틸리티, 데이터베이스 액세스, INI 파일 처리
- 여러 프로젝트에서 공유
- **ArinNet** - 네트워크 통신 유틸리티
- **ArinLogin** - 인증 및 사용자 관리
- 라이선스 검증, 암호화/복호화
- **ArinLog** - 로깅 기능
- **Utility** (C#) - 압축 유틸리티
- 데이터 압축을 위한 MiniLZO 구현
### 배포
- **Setup1** - 설치 프로그램 프로젝트 (`.vdproj`)
## 빌드 및 실행
### 솔루션 빌드
```bash
# Visual Studio에서 솔루션 열기
start ArinWareT4.sln
# 명령줄에서 빌드 (Visual Studio 필요)
msbuild ArinWareT4.sln /p:Configuration=Debug /p:Platform="Any CPU"
msbuild ArinWareT4.sln /p:Configuration=Release /p:Platform="Any CPU"
```
### 출력 경로
- **Debug**: `..\..\..\..\..\eco2\debug_2016\` (프로젝트 기준 상대 경로)
- **Release**: `c:\eco2\debug_2016\`
### 플랫폼 설정
- 타겟 플랫폼: **x86** (32비트)
- 프레임워크: **.NET Framework 4.0**
- Option Strict: **Off** (VB.NET 특성)
### 빌드 구성
- Debug / Release (표준)
- CD_ROM / DVD-5 / SingleImage (배포 구성)
## 아키텍처 개요
### 계산 엔진 (`ArinWarev1/Calculator/`)
계산 엔진은 건물 에너지 계산을 수행하는 전문 모듈로 구성됩니다:
**핵심 계산기 클래스**:
- `Calculator.vb` - 모든 계산 모듈을 조율하는 메인 오케스트레이터
- `CZone.vb` - 존 레벨 계산 (열존, 난방/냉방 부하)
- `CAirHandling.vb` - 공조 시스템 계산
- `CHeating.vb` - 난방 시스템 계산 (기기, 분배, 공급)
- `CCooling.vb` - 냉방 시스템 계산 (기기, 분배)
- `CRenewable.vb` - 신재생에너지 생산량 계산
- `CSummary.vb` - 결과 집계 및 요약 생성
- `CShared.vb` - 공유 계산 변수 및 유틸리티
**결과 처리** (`Calculator/Result/`):
- `CResult.vb` - 결과 데이터 구조
- `C1차소요량.vb` - 1차 에너지 소요량 계산
- `CCo2발생량.vb` - CO2 배출량 계산
- `C생산에너지.vb` - 에너지 생산량 계산
- `C사용면적.vb` - 사용 면적 계산
- `CZones.vb` - 존 결과 집계
### 데이터 흐름
```
사용자 입력 폼 (Forms_Input/)
DataSet (eco2DataSet - DS, DSR)
계산 엔진 (Calculator)
결과 클래스 (CResult, DSR)
리포트 폼 (Forms_Report/)
```
### 주요 데이터셋
- `DS` (DSET) - 입력 데이터 (사용자 입력 건물 정보)
- `DSR` (DSETR) - 결과 데이터 (계산된 에너지 값)
- `CResult` - 구조화된 계산 결과
### 폼 구성
**Forms_Input/** - 데이터 입력 폼
- `Frm_Desc.vb` - 건물 개요
- `Frm_kongjo.vb` - 공조 처리 입력
- `Frm_Bunbae.vb` - 분배 시스템 입력
- `Frm_custom_profile.vb` - 커스텀 사용 프로파일
**Forms_Report/** - 출력 및 보고
- `Frm_Upload.vb` - 인증 서버 업로드
- `Frm_Macro.vb`, `Frm_Macro2.vb` - Excel 리포트 생성
- `Frm_Export.vb` - 데이터 내보내기 기능
**Forms_Basic/** - 유틸리티 폼
- `Frm_Calc.vb` - 계산 트리거
- `Frm_Filter.vb` - 데이터 필터링
- `Frm_FileInfo.vb` - 파일 메타데이터
**Forms/** - 일반 응용 프로그램 폼
- `Frm_About.vb` - About 대화상자
- `Frm_Common.vb` - 공통 대화상자
### 메뉴 시스템 (MdiMain.vb)
`E_MenuIdx` 열거형에 정의된 메뉴 인덱스:
- 입력존
- 입력면
- 공조처리
- 난방기기/공급/분배
- 냉방기기/분배
- 신재생및열병합
- 열관류율
- 건물개요
- 월별에너지사용량
### 사용자 권한
`Prj.UserAuthType`을 통해 제어되는 사용자 유형:
- `ADMIN` - 전체 액세스
- `BOTH` - 전문 사용자 (계산 + 인증)
- `BOTH0` - 일반 사용자 (제한된 액세스)
- `BOTH1` - 확장 전문 사용자 액세스
## 외부 종속성
### FarPoint Spread (v5.0.3505.2008)
- 데이터 입력을 위한 Excel 형식의 스프레드시트 컨트롤
- 구성 요소: CalcEngine, Excel, PDF, Win, Chart
- 입력 폼에서 광범위하게 사용
### Microsoft ReportViewer
- `Microsoft.ReportViewer.Common.dll`
- `Microsoft.ReportViewer.WinForms.dll`
- 형식화된 보고서 생성에 사용
### Excel Interop
- `Interop.Excel.dll` - Excel 자동화를 위한 COM interop
- 매크로/내보내기 기능에 사용
### LOV 구성 요소
- `Lov.dll` - 값 목록 컨트롤 라이브러리
## 파일 형식 및 데이터 저장
### 프로젝트 파일 (.tpl 파일)
- LZO 압축 바이너리 형식 (Utility 프로젝트 사용)
- 건물 데이터, 계산 입력값, 결과 포함
- 사용자 지정 위치에 저장
- 최근 파일은 응용 프로그램 설정에서 추적
### 기상 데이터 (Data/*.xml)
- `weather_temp.xml` - 온도 데이터
- `weather_supdo.xml` - 습도 데이터
- `weather_ilsa.xml` - 일사량 데이터
- `weather_group.xml` - 기상 관측소 그룹
- `tbl_weather.xml` - 기상 위치 테이블
### 구성 파일
- `Frm_Setting.ini` - UI 상태 지속성 (창 크기, 위치)
- `login.dat` - 사용자 자격 증명 (암호화됨)
- `app.config` - 응용 프로그램 설정
## 한국 건축물 에너지 기준
이 응용 프로그램은 한국 건축물 에너지효율등급 인증 기준을 구현합니다:
### 주요 용어
- 건물개요
- 1차 에너지 소요량
- CO2 발생량
- 난방 / 냉방
- 급탕
- 조명 / 환기
- 신재생에너지
- 열관류율
- 공조
- 용도지역
### 계산 버전 관리
`StartVersion` 상수를 통한 버전 제어:
- 규제 준수를 위한 계산 엔진 버전 관리
- `Calculator.New()` 생성자에서 버전 확인
- 기준 버전 "2009123100"
## 개발 가이드라인
### VB.NET 규칙
- Option Strict는 OFF - 암시적 형식 변환 허용
- 한글 주석 및 변수명은 표준 관행
- 명명: 클래스, 메서드는 PascalCase; 로컬 변수는 엄격한 규칙 없음
### DataSet 사용
- 항상 타입 데이터셋 (`DS`, `DSR`) 사용
- 모듈 수준 변수 `DSET1`, `DSETR1`을 통해 액세스
- 타입 안전 액세스를 위해 DataRow 객체 사용
### 폼 관리
- `MdiMain`을 통한 MDI 자식 폼 관리
- `OpenedForm` 속성을 통해 열린 폼 추적
- `Prj.Opened`를 사용하여 프로젝트 파일 로드 여부 확인
### 계산 흐름
1. 프로젝트 파일 로드 → `DSET` 채우기
2. 사용자가 입력 폼 수정 → `DSET` 업데이트
3. 계산 트리거 → `Calculator` 클래스가 `DSET` 처리 → `DSETR``CResult` 채우기
4. 리포트 폼에 결과 표시
### 파일 작업
- 항상 MdiMain의 `Save_File()` / `Load_File()` 메서드 사용
- Utility 라이브러리를 통한 파일 압축 처리
- `PrjChanged` 플래그를 통한 파일 변경 추적
## 일반 작업
### 계산 실행
계산은 메뉴 또는 폼 버튼에서 트리거되고 `Calculator` 클래스를 통해 처리됩니다:
```vb
' 데이터셋 및 결과 객체로 계산기 초기화
Dim calc As New Calculator(version, DSET1, DSETR1, Result2, isSimulation)
' 초기화 오류 확인
If calc.IsError Then
' 오류 처리
Return
End If
' DSETR1 및 Result2에서 계산 결과 사용 가능
```
### 새 입력 필드 추가
1. 적절한 테이블에 열을 추가하도록 `eco2DataSet.xsd` 수정
2. 해당 입력 폼(`Forms_Input/*.vb`) 업데이트
3. 관련 `Calculator/*.vb` 클래스의 계산 로직 업데이트
4. 필요한 경우 리포트 폼 업데이트
### 새 계산 모듈 추가
1. `Calculator/` 디렉토리에 새 클래스 생성
2. 기존 모듈의 계산 패턴 상속
3. 생성자에서 `DS`, `DSR`, `CResult` 수락
4. `Calculator.vb` 오케스트레이터에 연결
5. `CSummary.vb`의 요약 집계 업데이트
### FarPoint Spread 컨트롤 작업
FarPoint 컨트롤은 그리드 기반 입력에 광범위하게 사용됩니다:
```vb
' Spread 컨트롤 액세스
Dim spread As FarPoint.Win.Spread.FpSpread = Me.FpSpread1
' 셀 값 설정
spread.ActiveSheet.Cells(row, col).Value = value
' 셀 값 읽기
Dim value = spread.ActiveSheet.Cells(row, col).Value
' 셀 속성 설정
spread.ActiveSheet.Cells(row, col).BackColor = Color.Yellow
```
## 알려진 패턴 및 규칙
### 전역 모듈 변수
- `DSET1` - 전역 입력 데이터셋 (DS 타입)
- `DSETR1` - 전역 결과 데이터셋 (DSR 타입)
- `Result2` - 전역 결과 객체 (CResult 타입)
- `Prj` - 전역 프로젝트 상태 객체
- `CLang` - 언어/지역화 문자열
### 오류 처리
- 계산 클래스의 `IsError` 속성 패턴
- 사용자 대면 오류에 대한 메시지 박스
- `On Error Resume Next`를 사용한 VB.NET 오류 처리 (레거시 패턴)
### 이벤트 처리
- 클래스 수준 이벤트 핸들러를 위한 WithEvents 패턴
- `Handles` 키워드를 통한 폼 이벤트 처리
### INI 파일 액세스
```vb
Dim ini As New MyINI(filePath)
Dim value = ini.Read(section, key, defaultValue)
ini.Write(section, key, value)
```
## 테스트 및 디버깅
### 디버그 모드
- Debug 구성으로 빌드
- 로컬 디버그 폴더로 출력
- 전체 심볼 정보 사용 가능
### 테스트 데이터
사용 가능한 샘플 프로젝트 파일:
- `sample.tpl` - 표준 샘플 건물
- `sample_0307.tpl` - 대체 샘플
- `sample_200.tpl` - 대형 건물 샘플
### 로깅
응용 프로그램 로깅에 ArinLog 라이브러리 사용:
```vb
pLog.Add("이벤트 설명", includeStackTrace)
```
## 언어 관련 참고사항
응용 프로그램은 한국 사용자를 위해 설계되었습니다:
- 모든 UI 텍스트는 한글
- 사용자 문서는 한글
- 한국 건축 기준 및 용어
- 날짜/시간 형식: 한국 표준
- 인코딩: 소스 파일은 UTF-8
주석 및 변수명은 한글과 영어를 혼용합니다 - 이는 의도적이며 이 코드베이스의 표준입니다.
## 배포 참고사항
### 설치
- 설치 프로그램 프로젝트: `Setup1/Setup1.vdproj`
- 메인 프로젝트에 구성된 ClickOnce 배포
- 게시 URL: `ftp://tindevil.com/www/mynetapp/t4/`
- 설치 URL: `http://tindevil.com/mynetapp/t4/`
### 버전 관리
- AssemblyInfo의 버전 정보
- ArinLogin 라이브러리를 통한 버전 확인
- 서버 측 버전 검증
### 업데이트
- 시작 시 업데이트 확인
- Foreground 업데이트 모드 (실행 전 업데이트)
- 7일 업데이트 간격 구성
## 보안 참고사항
### 인증
- ArinLogin 라이브러리를 통한 사용자 인증
- MAC 주소 검증 (상태 표시줄의 `lbl_mac`)
- 라이선스 관리 시스템
- `login.dat`의 암호화된 자격 증명
### 데이터 보호
- 데이터 보호를 위한 파일 압축
- ArinLogin.EnDec 클래스를 통한 암호화/복호화
- 라이선스 준수를 위한 네트워크 검증

View File

@@ -21,38 +21,8 @@
}
"Entry"
{
"MsmKey" = "8:_10584CE7F8FD47259F831F473D3D7913"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_1AA7E48E3A814420BFA5BCC62CC0DFE2"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_24C470B7579047B7AD6A2ADB631CAD1C"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_271370FB671C416DA057E99D6AE7C02E"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_29FE169CCEBDEB4C07246AF3E1D7D1EF"
"OwnerKey" = "8:_FF450D40DC624BBDB22749D13FD2AC4C"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_2D348C4D6D7B458BA9A2FB1B0DAA93B4"
"OwnerKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -63,12 +33,6 @@
}
"Entry"
{
"MsmKey" = "8:_337AEEB2D0B04E4F93037792EAD5F9C9"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_3553677EF48046758F4A80B5C3FC17B4"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
@@ -93,14 +57,8 @@
}
"Entry"
{
"MsmKey" = "8:_3F9A398398684A14950BF369963A139D"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_4608D921DC658CD173C039AF16C5E283"
"OwnerKey" = "8:_FF450D40DC624BBDB22749D13FD2AC4C"
"OwnerKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -112,7 +70,7 @@
"Entry"
{
"MsmKey" = "8:_4B290A29E53110D5B83008A4DD0873A2"
"OwnerKey" = "8:_FF450D40DC624BBDB22749D13FD2AC4C"
"OwnerKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -160,7 +118,7 @@
"Entry"
{
"MsmKey" = "8:_6BB2F49C9D04D801E8DE021D6CE20C22"
"OwnerKey" = "8:_FF450D40DC624BBDB22749D13FD2AC4C"
"OwnerKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -171,18 +129,6 @@
}
"Entry"
{
"MsmKey" = "8:_79E238A135B442D0A8F6C0F93216C05E"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_84A91CFD1A7C40E59B60E61C8A498EF0"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_88E9E9750BBC8DE9EFD32EE0994A73F2"
"OwnerKey" = "8:_29FE169CCEBDEB4C07246AF3E1D7D1EF"
"MsmSig" = "8:_UNDEFINED"
@@ -190,13 +136,13 @@
"Entry"
{
"MsmKey" = "8:_8BDE3E37C576268C85BFD64B9B0E7E24"
"OwnerKey" = "8:_FF450D40DC624BBDB22749D13FD2AC4C"
"OwnerKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_8EC9C4E69441F73892A4C676310B7ABE"
"OwnerKey" = "8:_FF450D40DC624BBDB22749D13FD2AC4C"
"OwnerKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -220,13 +166,7 @@
"Entry"
{
"MsmKey" = "8:_ADE6E41741BD7CD14907A44E54816E0D"
"OwnerKey" = "8:_FF450D40DC624BBDB22749D13FD2AC4C"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_B56C68177A22463BB0BBFD7B6DF6DA83"
"OwnerKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -244,7 +184,7 @@
"Entry"
{
"MsmKey" = "8:_CE47408D9D1AC3C1A1C987DBD7CA7F43"
"OwnerKey" = "8:_FF450D40DC624BBDB22749D13FD2AC4C"
"OwnerKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -255,8 +195,14 @@
}
"Entry"
{
"MsmKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_E5FD918B4BE4C70000A151506717226F"
"OwnerKey" = "8:_FF450D40DC624BBDB22749D13FD2AC4C"
"OwnerKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -267,18 +213,6 @@
}
"Entry"
{
"MsmKey" = "8:_E904F31D33784D7CA7A4C94E05D10A6D"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_EA4938B895C1481C8955D3F33247549E"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_ECC375834F59CEFC1D106FE35A78C9C5"
"OwnerKey" = "8:_59B3512FD7C9D2430BF7B3C6379B9C9D"
"MsmSig" = "8:_UNDEFINED"
@@ -291,8 +225,68 @@
}
"Entry"
{
"MsmKey" = "8:_FF450D40DC624BBDB22749D13FD2AC4C"
"OwnerKey" = "8:_UNDEFINED"
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_4608D921DC658CD173C039AF16C5E283"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_59B3512FD7C9D2430BF7B3C6379B9C9D"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_36E293D174759AFAAD42CF70AA63402C"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_ECC375834F59CEFC1D106FE35A78C9C5"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_29FE169CCEBDEB4C07246AF3E1D7D1EF"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_F7DF6157CD83D46091E6404B3E2CE830"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_691C9DA50302E0464D0E64E97C1242A2"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_4B290A29E53110D5B83008A4DD0873A2"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_88E9E9750BBC8DE9EFD32EE0994A73F2"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_BFCB09EF0CA43B0269B207A4DB42D1BF"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -304,12 +298,6 @@
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_FF450D40DC624BBDB22749D13FD2AC4C"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_6BB2F49C9D04D801E8DE021D6CE20C22"
"MsmSig" = "8:_UNDEFINED"
}
@@ -337,66 +325,6 @@
"OwnerKey" = "8:_CE47408D9D1AC3C1A1C987DBD7CA7F43"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_F7DF6157CD83D46091E6404B3E2CE830"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_ECC375834F59CEFC1D106FE35A78C9C5"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_BFCB09EF0CA43B0269B207A4DB42D1BF"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_88E9E9750BBC8DE9EFD32EE0994A73F2"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_691C9DA50302E0464D0E64E97C1242A2"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_59B3512FD7C9D2430BF7B3C6379B9C9D"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_4B290A29E53110D5B83008A4DD0873A2"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_4608D921DC658CD173C039AF16C5E283"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_36E293D174759AFAAD42CF70AA63402C"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_29FE169CCEBDEB4C07246AF3E1D7D1EF"
"MsmSig" = "8:_UNDEFINED"
}
}
"Configurations"
{
@@ -532,86 +460,6 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_10584CE7F8FD47259F831F473D3D7913"
{
"SourcePath" = "8:C:\\ECO2\\debug_2016\\Data\\weather_sd.xml"
"TargetName" = "8:weather_sd.xml"
"Tag" = "8:"
"Folder" = "8:_A02FAE1984434D0C9BCF4CCA745960F5"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1AA7E48E3A814420BFA5BCC62CC0DFE2"
{
"SourcePath" = "8:C:\\ECO2\\debug_2016\\Data\\weather.xml"
"TargetName" = "8:weather.xml"
"Tag" = "8:"
"Folder" = "8:_A02FAE1984434D0C9BCF4CCA745960F5"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_24C470B7579047B7AD6A2ADB631CAD1C"
{
"SourcePath" = "8:C:\\ECO2\\debug_2016\\Data\\weather_wind.xml"
"TargetName" = "8:weather_wind.xml"
"Tag" = "8:"
"Folder" = "8:_A02FAE1984434D0C9BCF4CCA745960F5"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_271370FB671C416DA057E99D6AE7C02E"
{
"SourcePath" = "8:C:\\ECO2\\debug_2016\\Data\\weather_water.xml"
"TargetName" = "8:weather_water.xml"
"Tag" = "8:"
"Folder" = "8:_A02FAE1984434D0C9BCF4CCA745960F5"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_29FE169CCEBDEB4C07246AF3E1D7D1EF"
{
"AssemblyRegister" = "3:1"
@@ -643,26 +491,6 @@
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_2D348C4D6D7B458BA9A2FB1B0DAA93B4"
{
"SourcePath" = "8:C:\\ECO2\\debug_2016\\new1"
"TargetName" = "8:new1"
"Tag" = "8:"
"Folder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3273FC8CB0914298B621226C45585341"
{
"SourcePath" = "8:C:\\ECO2\\debug_2016\\Data\\tbl_weather.dat"
@@ -683,26 +511,6 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_337AEEB2D0B04E4F93037792EAD5F9C9"
{
"SourcePath" = "8:C:\\ECO2\\debug_2016\\new"
"TargetName" = "8:new"
"Tag" = "8:"
"Folder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3553677EF48046758F4A80B5C3FC17B4"
{
"SourcePath" = "8:C:\\ECO2\\debug_2016\\Data\\weather_temp.dat"
@@ -794,26 +602,6 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3F9A398398684A14950BF369963A139D"
{
"SourcePath" = "8:C:\\ECO2\\debug_2016\\Data\\weather_is.xml"
"TargetName" = "8:weather_is.xml"
"Tag" = "8:"
"Folder" = "8:_A02FAE1984434D0C9BCF4CCA745960F5"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_4608D921DC658CD173C039AF16C5E283"
{
"AssemblyRegister" = "3:1"
@@ -1049,46 +837,6 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_79E238A135B442D0A8F6C0F93216C05E"
{
"SourcePath" = "8:C:\\ECO2\\debug_2016\\Data\\weather_tp.xml"
"TargetName" = "8:weather_tp.xml"
"Tag" = "8:"
"Folder" = "8:_A02FAE1984434D0C9BCF4CCA745960F5"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_84A91CFD1A7C40E59B60E61C8A498EF0"
{
"SourcePath" = "8:C:\\ECO2\\debug_2016\\newx1.ecox"
"TargetName" = "8:newx1.ecox"
"Tag" = "8:"
"Folder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_88E9E9750BBC8DE9EFD32EE0994A73F2"
{
"AssemblyRegister" = "3:1"
@@ -1273,26 +1021,6 @@
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B56C68177A22463BB0BBFD7B6DF6DA83"
{
"SourcePath" = "8:C:\\ECO2\\debug_2016\\Data\\weather_river.xml"
"TargetName" = "8:weather_river.xml"
"Tag" = "8:"
"Folder" = "8:_A02FAE1984434D0C9BCF4CCA745960F5"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_BFCB09EF0CA43B0269B207A4DB42D1BF"
{
"AssemblyRegister" = "3:1"
@@ -1395,6 +1123,37 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DF16200C7C9B40998C022F2E37D1E143"
{
"AssemblyRegister" = "3:1"
"AssemblyIsInGAC" = "11:FALSE"
"AssemblyAsmDisplayName" = "8:Eco2Ar, Version=1.2017.122.1014, Culture=neutral, processorArchitecture=x86"
"ScatterAssemblies"
{
"_DF16200C7C9B40998C022F2E37D1E143"
{
"Name" = "8:Eco2Ar.exe"
"Attributes" = "3:512"
}
}
"SourcePath" = "8:C:\\ECO2\\dotfus_2016\\Eco2Ar.exe"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_E5FD918B4BE4C70000A151506717226F"
{
"AssemblyRegister" = "3:1"
@@ -1426,46 +1185,6 @@
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_E904F31D33784D7CA7A4C94E05D10A6D"
{
"SourcePath" = "8:C:\\ECO2\\debug_2016\\Data\\weather_ch.xml"
"TargetName" = "8:weather_ch.xml"
"Tag" = "8:"
"Folder" = "8:_A02FAE1984434D0C9BCF4CCA745960F5"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_EA4938B895C1481C8955D3F33247549E"
{
"SourcePath" = "8:C:\\ECO2\\debug_2016\\Data\\weather_gr.xml"
"TargetName" = "8:weather_gr.xml"
"Tag" = "8:"
"Folder" = "8:_A02FAE1984434D0C9BCF4CCA745960F5"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_ECC375834F59CEFC1D106FE35A78C9C5"
{
"AssemblyRegister" = "3:1"
@@ -1528,37 +1247,6 @@
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_FF450D40DC624BBDB22749D13FD2AC4C"
{
"AssemblyRegister" = "3:1"
"AssemblyIsInGAC" = "11:FALSE"
"AssemblyAsmDisplayName" = "8:Eco2Ar, Version=1.2017.122.1009, Culture=neutral, processorArchitecture=x86"
"ScatterAssemblies"
{
"_FF450D40DC624BBDB22749D13FD2AC4C"
{
"Name" = "8:Eco2Ar.exe"
"Attributes" = "3:512"
}
}
"SourcePath" = "8:C:\\ECO2\\dotfus_2016\\Eco2Ar.exe"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
}
"FileType"
{
@@ -1638,7 +1326,7 @@
"Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:ECO2_2025V1"
"ProductCode" = "8:{1C694875-DBD9-43E7-A9DC-0EEE63429810}"
"PackageCode" = "8:{4ADF053D-B645-48FF-95E6-2F2224AA7A84}"
"PackageCode" = "8:{172D8716-29F9-4949-8F2B-52F268078F21}"
"UpgradeCode" = "8:{650A91F6-635B-4C09-8A64-C123C180E487}"
"AspNetVersion" = "8:2.0.50727.0"
"RestartWWWService" = "11:FALSE"
@@ -1766,7 +1454,7 @@
"ShowCmd" = "3:1"
"IconIndex" = "3:0"
"Transitive" = "11:FALSE"
"Target" = "8:_FF450D40DC624BBDB22749D13FD2AC4C"
"Target" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"Folder" = "8:_89D815457C274E5890E728BDBFF2EA16"
"WorkingFolder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
"Icon" = "8:_5D29234F4F444C9AAE7845416706303D"
@@ -1780,7 +1468,7 @@
"ShowCmd" = "3:1"
"IconIndex" = "3:0"
"Transitive" = "11:FALSE"
"Target" = "8:_FF450D40DC624BBDB22749D13FD2AC4C"
"Target" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"Folder" = "8:_8ACC8683286847D288C7D970B3389046"
"WorkingFolder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
"Icon" = "8:_5D29234F4F444C9AAE7845416706303D"

View File

@@ -10,7 +10,7 @@
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Utility</RootNamespace>
<AssemblyName>Utility</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">

View File

@@ -0,0 +1,68 @@
@echo off
chcp 65001 > nul
echo ========================================
echo OWIN NuGet 패키지 다운로드
echo (압축 해제는 수동으로 진행)
echo ========================================
echo.
REM 다운로드 폴더 생성
echo [1/2] 다운로드 폴더 생성 중...
if not exist "owin_packages" mkdir owin_packages
cd owin_packages
echo 완료
echo.
REM NuGet 패키지 다운로드 (.zip으로 저장)
echo [2/2] NuGet 패키지 다운로드 중...
echo.
echo 다운로드: Owin.1.0.0.zip
powershell -Command "Invoke-WebRequest -Uri 'https://www.nuget.org/api/v2/package/Owin/1.0.0' -OutFile 'Owin.1.0.0.zip'"
echo 완료
echo 다운로드: Microsoft.Owin.2.1.0.zip
powershell -Command "Invoke-WebRequest -Uri 'https://www.nuget.org/api/v2/package/Microsoft.Owin/2.1.0' -OutFile 'Microsoft.Owin.2.1.0.zip'"
echo 완료
echo 다운로드: Microsoft.Owin.Host.HttpListener.2.1.0.zip
powershell -Command "Invoke-WebRequest -Uri 'https://www.nuget.org/api/v2/package/Microsoft.Owin.Host.HttpListener/2.1.0' -OutFile 'Microsoft.Owin.Host.HttpListener.2.1.0.zip'"
echo 완료
echo 다운로드: Microsoft.Owin.Hosting.2.1.0.zip
powershell -Command "Invoke-WebRequest -Uri 'https://www.nuget.org/api/v2/package/Microsoft.Owin.Hosting/2.1.0' -OutFile 'Microsoft.Owin.Hosting.2.1.0.zip'"
echo 완료
echo 다운로드: Microsoft.Owin.StaticFiles.2.1.0.zip
powershell -Command "Invoke-WebRequest -Uri 'https://www.nuget.org/api/v2/package/Microsoft.Owin.StaticFiles/2.1.0' -OutFile 'Microsoft.Owin.StaticFiles.2.1.0.zip'"
echo 완료
echo 다운로드: Microsoft.Owin.FileSystems.2.1.0.zip
powershell -Command "Invoke-WebRequest -Uri 'https://www.nuget.org/api/v2/package/Microsoft.Owin.FileSystems/2.1.0' -OutFile 'Microsoft.Owin.FileSystems.2.1.0.zip'"
echo 완료
cd ..
echo.
echo ========================================
echo 다운로드 완료!
echo ========================================
echo.
echo 다운로드된 파일 목록:
dir /b owin_packages\*.zip
echo.
echo 다음 단계:
echo 1. owin_packages 폴더 열기
echo 2. 각 .zip 파일을 압축 해제
echo 3. 각 폴더의 lib\net40\ 경로에서 .dll 파일 찾기
echo 4. 모든 .dll 파일을 lib 폴더로 복사
echo.
echo 필요한 DLL 파일 목록:
echo - Owin.dll
echo - Microsoft.Owin.dll
echo - Microsoft.Owin.Host.HttpListener.dll
echo - Microsoft.Owin.Hosting.dll
echo - Microsoft.Owin.StaticFiles.dll
echo - Microsoft.Owin.FileSystems.dll
echo.
pause

143
host_eco2_guide_fixed.bat Normal file
View File

@@ -0,0 +1,143 @@
@echo off
chcp 65001 > nul
echo ========================================
echo ECO2 Guide Center 로컬 호스팅
echo ========================================
echo.
REM 현재 디렉토리 확인
set CURRENT_DIR=%CD%
echo 현재 디렉토리: %CURRENT_DIR%
echo.
REM eco2_guide_center 저장소 경로 확인
set GUIDE_REPO=eco2_guide_center
if not exist "%GUIDE_REPO%" (
echo [1/4] 저장소 클론 중...
git clone https://github.com/VeryColdplay/eco2_guide_center.git
if errorlevel 1 (
echo 오류: 저장소 클론 실패
echo Git이 설치되어 있는지 확인하세요.
pause
exit /b 1
)
echo 완료
) else (
echo [1/4] 저장소 업데이트 중...
cd %GUIDE_REPO%
git pull
cd ..
echo 완료
)
echo.
REM 필요한 패키지 설치
echo [2/4] Python 패키지 설치 중...
echo (네트워크 연결이 필요합니다. 시간이 걸릴 수 있습니다...)
echo.
REM 방화벽이나 프록시 문제가 있을 수 있으므로 개별 설치 시도
pip install mkdocs-material 2>nul
if errorlevel 1 (
echo 경고: mkdocs-material 설치 실패 - 이미 설치되어 있거나 네트워크 문제일 수 있습니다.
)
pip install mkdocs-macros-plugin 2>nul
pip install mkdocs-mermaid2-plugin 2>nul
pip install mkdocs-table-reader-plugin 2>nul
pip install mkdocs-glightbox 2>nul
pip install mkdocs-git-revision-date-localized-plugin 2>nul
pip install mkdocs-minify-plugin 2>nul
pip install mkdocs-awesome-pages-plugin 2>nul
echo 패키지 설치 시도 완료
echo.
REM MkDocs 빌드
echo [3/4] MkDocs 빌드 중...
cd %GUIDE_REPO%
REM mkdocs.yml에서 awesome-pages 플러그인 제거 (임시)
echo awesome-pages 플러그인 비활성화 중...
powershell -Command "(Get-Content mkdocs.yml) -replace ' - awesome-pages', ' # - awesome-pages' | Set-Content mkdocs_temp.yml"
REM 정적 사이트 빌드
echo MkDocs 빌드 실행...
mkdocs build -f mkdocs_temp.yml
if errorlevel 1 (
echo.
echo 오류: MkDocs 빌드 실패
echo.
echo 해결 방법:
echo 1. Python이 설치되어 있는지 확인
echo 2. 인터넷 연결 확인
echo 3. 방화벽/프록시 설정 확인
echo 4. 관리자 권한으로 실행
echo.
echo 또는 수동 설치:
echo pip install mkdocs-material mkdocs-awesome-pages-plugin
echo.
del mkdocs_temp.yml 2>nul
cd ..
pause
exit /b 1
)
del mkdocs_temp.yml 2>nul
echo 완료
echo.
REM ECO2 wwwroot 폴더로 복사
echo [4/4] ECO2 wwwroot로 복사 중...
cd ..
REM wwwroot 폴더 생성
if not exist "wwwroot" mkdir wwwroot
REM 기존 파일 백업 (선택사항)
if exist "wwwroot\index.html" (
echo 기존 파일 발견 - 백업 생성 중...
if not exist "wwwroot_backup" mkdir wwwroot_backup
xcopy /E /I /Y "wwwroot\*" "wwwroot_backup\" > nul
)
REM site 폴더 내용 복사
echo 빌드된 파일 복사 중...
xcopy /E /I /Y "%GUIDE_REPO%\site\*" "wwwroot\" > nul
if errorlevel 1 (
echo 오류: 파일 복사 실패
pause
exit /b 1
)
echo 완료
echo.
REM 파일 개수 확인
for /f %%A in ('dir /b /s "wwwroot\*.html" ^| find /c ".html"') do set HTML_COUNT=%%A
echo 복사된 HTML 파일: %HTML_COUNT%
echo.
echo ========================================
echo 호스팅 준비 완료!
echo ========================================
echo.
echo wwwroot 폴더: %CURRENT_DIR%\wwwroot
echo.
echo 다음 중 한 가지 방법으로 접속:
echo.
echo [방법 1] ECO2 프로그램의 OWIN 서버 사용
echo 1. ECO2 프로그램 실행
echo 2. OWIN 서버 시작 (포트 58123)
echo 3. 브라우저: http://localhost:58123
echo.
echo [방법 2] MkDocs 개발 서버 사용 (추천 - 자동 새로고침)
echo 1. cd eco2_guide_center
echo 2. mkdocs serve
echo 3. 브라우저: http://127.0.0.1:8000
echo.
echo [방법 3] Python 간단 서버 사용
echo 1. cd wwwroot
echo 2. python -m http.server 8080
echo 3. 브라우저: http://localhost:8080
echo.
pause

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
lib/Microsoft.Owin.dll Normal file

Binary file not shown.

BIN
lib/Owin.dll Normal file

Binary file not shown.

BIN
nuget.exe Normal file

Binary file not shown.