This commit is contained in:
Javier Alvarez-Valle 2021-03-25 16:08:33 +00:00
Коммит b6edf68fa6
590 изменённых файлов: 200871 добавлений и 0 удалений

4
.flake8 Normal file
Просмотреть файл

@ -0,0 +1,4 @@
[flake8]
ignore = E226,E302,E41,W391, E701, W291, E722, W503, E128, E126, E127, E731, E401
max-line-length = 160
max-complexity = 25

3
.gitattributes поставляемый Normal file
Просмотреть файл

@ -0,0 +1,3 @@
*.dcm filter=lfs diff=lfs merge=lfs -text
*.nii.gz filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text

264
.github/workflows/build-test-pr.yml поставляемый Normal file
Просмотреть файл

@ -0,0 +1,264 @@
name: PR BuildAndTest.CI
on:
push:
branches: [ main ]
tags:
- '*'
pull_request:
branches: [ main ]
env:
buildPlatform: x64
buildConfiguration: Release
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
DOTNET_CLI_TELEMETRY_OPTOUT: true
dotnetVersion: 2.1.x
pythonVersion: 3.7
jobs:
build-test-csharp:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ ubuntu-latest, windows-latest ]
solutionDir: [ './RTConvert', './Echo' ]
steps:
- uses: actions/checkout@v2
with:
lfs: true
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
dotnet-version: ${{ env.dotnetVersion }}
- name: Print .NET version
run: dotnet --info
- name: Clean package cache as a temporary workaround for https://github.com/actions/setup-dotnet/issues/155
run: dotnet clean ${{ matrix.solutionDir }} --configuration ${{ env.buildConfiguration }} && dotnet nuget locals all --clear
- name: Restore Dependencies
run: dotnet restore ${{ matrix.solutionDir }}
- name: Build Solution
run: dotnet build ${{ matrix.solutionDir }} --configuration ${{ env.buildConfiguration }} --no-restore /p:Platform=${{ env.buildPlatform }}
- name: For testing on Ubuntu, install libgdiplus
if: matrix.os == 'ubuntu-latest'
run: apt-get -s install libgdiplus
- name: Run Unit Tests
run: dotnet test ${{ matrix.solutionDir }} --configuration ${{ env.buildConfiguration }} --no-restore
- name: Publish
run: dotnet publish ${{ matrix.solutionDir }} --configuration ${{ env.buildConfiguration }} -p:Platform=${{ env.buildPlatform }}
- name: Upload Echo Build Artifacts
if: matrix.os == 'ubuntu-latest' && matrix.solutionDir == './Echo'
uses: actions/upload-artifact@v2
with:
name: echo
path: Echo/Echo/bin/${{ env.buildPlatform }}/${{ env.buildConfiguration }}/netcoreapp2.1/publish/*
- name: Upload RTConvert Build Artifacts
if: matrix.os == 'ubuntu-latest' && matrix.solutionDir == './RTConvert'
uses: actions/upload-artifact@v2
with:
name: rtconvert
path: RTConvert/Microsoft.RTConvert.Console/bin/${{ env.buildPlatform }}/${{ env.buildConfiguration }}/netcoreapp2.1/publish/*
build-test-python:
runs-on: ubuntu-latest
needs: [build-test-csharp]
steps:
- uses: actions/checkout@v2
with:
lfs: true
- name: Set up Python ${{ env.pythonVersion }}
uses: actions/setup-python@v2
with:
python-version: ${{ env.pythonVersion }}
- name: Display Python version
run: python -c "import sys; print(sys.version)"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
if [ -f build_requirements.txt ]; then pip install -r build_requirements.txt; fi
- name: flake8
run: flake8 . --count --exit-zero --statistics
- name: mypy
run: |
mypy setup.py
mypy -p src
mypy -p tests
- name: Download Echo Build Artifact
uses: actions/download-artifact@v2
with:
name: echo
path: src/InnerEye_DICOM_RT/bin/netcoreapp2.1
- name: Download RTConvert Build Artifact
uses: actions/download-artifact@v2
with:
name: rtconvert
path: src/InnerEye_DICOM_RT/bin/netcoreapp2.1
- name: Test with pytest
run: pytest --cov=src --cov-report=html tests
- name: Archive code coverage results
uses: actions/upload-artifact@v2
with:
name: code-coverage-report
path: htmlcov/*
- name: Build Distribution
run: python setup.py sdist bdist_wheel
- name: Upload Distribution
uses: actions/upload-artifact@v2
with:
name: dist
path: dist/*
test-artifact-pkg:
runs-on: ubuntu-latest
needs: [build-test-python]
strategy:
matrix:
packageName: [ '*.whl', '*.tar.gz' ]
steps:
- uses: actions/checkout@v2
with:
lfs: true
- name: Set up Python ${{ env.pythonVersion }}
uses: actions/setup-python@v2
with:
python-version: ${{ env.pythonVersion }}
- name: Display Python version
run: python -c "import sys; print(sys.version)"
- name: Download Distribution
uses: actions/download-artifact@v2
with:
name: dist
path: dist
- name: List contents of dist
run: ls -al dist
- name: Set env
run: echo "wheel_filename=$(find dist -name ${{ matrix.packageName }})" >> $GITHUB_ENV
- name: Test env
run: echo $wheel_filename
- name: Install dependencies
run: |
python -m pip install --upgrade pip
if [ -f test_requirements.txt ]; then pip install -r test_requirements.txt; fi
- name: Install artifact
run:
pip install $wheel_filename
- name: Test with pytest
run: pytest tests
publish-testpypi-pkg:
runs-on: ubuntu-latest
needs: [test-artifact-pkg]
steps:
- name: Download Distribution
uses: actions/download-artifact@v2
with:
name: dist
path: dist
- name: Publish package to TestPyPI
uses: pypa/gh-action-pypi-publish@master
with:
user: __token__
password: ${{ secrets.TEST_PIPY_TOKEN }}
repository_url: https://test.pypi.org/legacy/
verbose: true
test-testpypi-pkg:
runs-on: ubuntu-latest
needs: [publish-testpypi-pkg]
steps:
- uses: actions/checkout@v2
with:
lfs: true
- name: Set up Python ${{ env.pythonVersion }}
uses: actions/setup-python@v2
with:
python-version: ${{ env.pythonVersion }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
if [ -f test_requirements.txt ]; then pip install -r test_requirements.txt; fi
# dotnetcore2 should be installed from PyPI first, skipping this step
# seems to try to download dotnetcore2 from Test.PyPI and it causes a dependency problem.
- name: Install dotnetcore2 dependency
run: pip install dotnetcore2
- name: Install test package
run: pip install -i https://test.pypi.org/simple/ InnerEye-DICOM-RT
- name: Test with pytest
run: pytest tests
publish-pypi-pkg:
runs-on: ubuntu-latest
needs: [test-testpypi-pkg]
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
steps:
- name: Download Distribution
uses: actions/download-artifact@v2
with:
name: dist
path: dist
- name: Publish package to PyPI
uses: pypa/gh-action-pypi-publish@master
with:
user: __token__
password: ${{ secrets.PYPI_TOKEN }}
test-pypi-pkg:
runs-on: ubuntu-latest
needs: [publish-pypi-pkg]
steps:
- uses: actions/checkout@v2
with:
lfs: true
- name: Set up Python ${{ env.pythonVersion }}
uses: actions/setup-python@v2
with:
python-version: ${{ env.pythonVersion }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
if [ -f test_requirements.txt ]; then pip install -r test_requirements.txt; fi
- name: Install package
run: pip install InnerEye-DICOM-RT
- name: Test with pytest
run: pytest tests

67
.github/workflows/codeql-analysis.yml поставляемый Normal file
Просмотреть файл

@ -0,0 +1,67 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ main, PR ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ main ]
schedule:
- cron: '20 1 * * 6' # https://crontab.guru/#20_1_*_*_6 this is: At 01:20 on Saturday.
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
language: [ 'csharp', 'python' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
# Learn more:
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
steps:
- name: Checkout repository
uses: actions/checkout@v2
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

385
.gitignore поставляемый Normal file
Просмотреть файл

@ -0,0 +1,385 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
### PYTHON
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# Distribution / packaging
.Python
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
build/
.idea/inspectionProfiles/profiles_settings.xml
.idea/misc.xml
.idea/mypy.xml
.idea/workspace.xml
.idea/deployment.xml
/.idea/dictionaries
/.idea/pylint.xml
htmlcov/
tests/test.dcm

9
CODE_OF_CONDUCT.md Normal file
Просмотреть файл

@ -0,0 +1,9 @@
# Microsoft Open Source Code of Conduct
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
Resources:
- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)
- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns

25
Echo/Echo.sln Normal file
Просмотреть файл

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30804.86
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Echo", "Echo\Echo.csproj", "{09E3FF8D-3C60-4F13-A629-D9B7664D7C51}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{09E3FF8D-3C60-4F13-A629-D9B7664D7C51}.Debug|x64.ActiveCfg = Debug|x64
{09E3FF8D-3C60-4F13-A629-D9B7664D7C51}.Debug|x64.Build.0 = Debug|x64
{09E3FF8D-3C60-4F13-A629-D9B7664D7C51}.Release|x64.ActiveCfg = Release|x64
{09E3FF8D-3C60-4F13-A629-D9B7664D7C51}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {E9BF2AB7-6CFB-450B-A636-5742FF7394E2}
EndGlobalSection
EndGlobal

9
Echo/Echo/Echo.csproj Normal file
Просмотреть файл

@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
<Platforms>x64</Platforms>
</PropertyGroup>
</Project>

25
Echo/Echo/Program.cs Normal file
Просмотреть файл

@ -0,0 +1,25 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
using System;
namespace Echo
{
class Program
{
static void Main(string[] args)
{
if (args.Length < 1)
{
throw new Exception("Require at least one argument.");
}
Console.WriteLine(args[0]);
if (args.Length > 1)
{
Console.Error.WriteLine(args[1]);
}
}
}
}

21
LICENSE Normal file
Просмотреть файл

@ -0,0 +1,21 @@
MIT License
Copyright (c) Microsoft Corporation.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE

2
MANIFEST.in Normal file
Просмотреть файл

@ -0,0 +1,2 @@
include LICENSE
graft src/InnerEye_DICOM_RT/bin

8
Makefile Normal file
Просмотреть файл

@ -0,0 +1,8 @@
init:
pip install -r requirements.txt
test:
pytest tests
build:
python setup.py sdist bdist_wheel

176
README.md Normal file
Просмотреть файл

@ -0,0 +1,176 @@
# Introduction
InnerEye-DICOM-RT contains tools to convert medical datasets in NIFTI format to DICOM-RT. Datasets converted using
this tool can be consumed directly by [InnerEye-DeepLearning](https://github.com/microsoft/InnerEye-DeepLearning).
Most of the work is done by a .NET Core 2.1 project in RTConvert, written in C#. There is a very lightweight wrapper
around this so that it can be consumed from Python. The wrapper relies on the PyPI package https://pypi.org/project/dotnetcore2/ which wraps up .NET Core 2.1.
# Installing
## Git for Windows
Get the installer from [Git for Windows](https://git-scm.com/download/win)
The installer will prompt you to "Select Components". Make sure that you tick
* Git LFS (Large File Support)
* Git Credential Manager for Windows
After the installation, open a command prompt or the Git Bash:
- Run `git lfs install` to set up the hooks in git
- Run `git config --global core.autocrlf true` to ensure that line endings are working as expected
Clone the InnerEye-DICOM-RT repository on your machine: Run `git lfs clone --recursive https://github.com/microsoft/InnerEye-DICOM-RT`
## Visual Studio / .NET Core
The C# components can be built with the .NET Core SDK. We use version 2.1 for compatibility with the PyPI package `dotnetcore2`.
Installation instructions are here: https://docs.microsoft.com/en-us/dotnet/core/install/.
Visual Studio is not required to build, but if you wish to use it then for .Net Core 2.1 you need at least:
[Visual Studio 2017 version 15.7](https://visualstudio.microsoft.com/vs/?utm_medium=microsoft&utm_source=docs.microsoft.com&utm_campaign=inline+link).
### RTConvert
RTConvert can be built from a .NET Core command line:
```bash
dotnet build RTConvert
```
There are unit tests:
```bash
dotnet test RTConvert
```
Note that the unit tests have a dependency on `System.Drawing` and that on Linux `System.Drawing` requires a native package:
```bash
apt-get -s install libgdiplus
```
Finally, for consumption by the Python wrapper, this solution must be published:
```bash
dotnet publish RTConvert --configuration Release -p:Platform=x64
```
This should create a folder with all the requirements for RTConvert at:
`RTConvert/Microsoft.RTConvert.Console/bin/x64/Release/netcoreapp2.1/publish/*`
### Echo
Echo is a very simple application that takes 1 or 2 arguments. The first is echoed to `stdout`, and if a
second argument is supplied then it is echoed to `stderr`. This is only required for units tests to establish
that a .NET Core application can be called.
Echo can be built from a .NET Core command line:
```bash
dotnet build Echo
```
There are no unit tests.
Finally, for consumption by the Python wrapper, this solution must be published:
```bash
dotnet publish Echo --configuration Release -p:Platform=x64
```
This should create a folder with all the requirements for Echo at: `Echo/Echo/bin/x64/Release/netcoreapp2.1/publish/*`
## Python
The Python wrapper is in `src/InnerEye_DICOM_RT/nifti_to_dicom_rt_converter.py`. It simply uses `subprocess.Popen` to invoke
the .NET Core application passing in the relevant dll and command line arguments.
It does require that the RTConvert and Echo published packages are copied to the folder: `src/InnerEye_DICOM_RT/bin/netcoreapp2.1`.
Note that the github build action does this automatically, but if testing then this needs to be done
manually.
The Python package is created with:
```bash
python setup.py sdist bdist_wheel
```
which builds a source distribution and wheel to the `dist` folder.
To run the Python tests:
```bash
pip install pytest dotnetcore2
pytest tests
```
## Usage
To consume this package:
```bash
pip install InnerEye-DICOM-RT
```
To call RTConvert:
```python
from InnerEye_DICOM_RT.nifti_to_dicom_rt_converter import rtconvert
(stdout, stderr) = rtconvert(
in_file=NiftiSegmentationLocation,
reference_series=DicomVolumeLocation,
out_file=OutputFile,
struct_names=StructureNames,
struct_colors=StructureColors,
fill_holes=FillHoles
)
```
where:
* `in_file` is the path to the input Nifti file. This file is a 3D volume in [Nifti format](https://nifti.nimh.nih.gov/).
* `reference_series` is the path to the input folder containing the reference DICOM series;
* `out_file` is the path to the output DICOM-RT file;
* `struct_names` is a list of structure names like: ["External", "parotid_l", "parotid_r", "smg_l"].
Each structure name corresponds to a non-zero voxel value in the input volume. In the example External corresponds to voxel
value 1, parotid_l to 2, etc. Voxels with value 0 are dropped.
If there are voxels without a corresponding structure name, they will also be dropped.
The structure name will become its ROI Name in the Structure Set ROI Sequence in the Structure Set in the DICOM-RT file.
* `struct_colors` is a list of structure colors in hexadecimal notation like: ["000000", "FF0080", "00FF00", "0000FF"].
Each color in this list corresponds to a structure in struct_names and will become its ROI Display Color
in the ROI Contour Sequence in the ROI Contour in the DICOM-RT file.
If there are less colors than struct_names, or if an entry is empty, the default is red (FF0000);
* `fill_holes` is a list of bools like: [True, False, True].
If there are less bools than struct_names, or if an entry is empty, the default is false.
If True then any contours found per slice will have their holes filled, otherwise contours will be returned
as found.
* `modelId` Model name and version from AzureML. E.g. Prostate:123
* `manufacturer` Manufacturer for the DICOM-RT
* `interpreter` Interpreter for the DICOM-RT
[MIT License](LICENSE)
**You are responsible for the performance, the necessary testing, and if needed any regulatory clearance for
any of the models produced by this toolbox.**
## Contributing
This project welcomes contributions and suggestions. Most contributions require you to agree to a
Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us
the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com.
When you submit a pull request, a CLA bot will automatically determine whether you need to provide
a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions
provided by the bot. You will only need to do this once across all repos using our CLA.
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or
contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
## Trademarks
This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft
trademarks or logos is subject to and must follow
[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).
Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.
Any use of third-party trademarks or logos are subject to those third-party's policies.

Просмотреть файл

@ -0,0 +1,80 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30717.126
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.RTConvert.Converters", "Microsoft.RTConvert.Converters\Microsoft.RTConvert.Converters.csproj", "{1E0B744B-77A3-4D47-910A-E14FDCD3B824}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.RTConvert.MedIO", "Microsoft.RTConvert.MedIO\Microsoft.RTConvert.MedIO.csproj", "{6E6787B0-8519-4347-A740-8C01EB63BBA9}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.RTConvert.Contours", "Microsoft.RTConvert.Contours\Microsoft.RTConvert.Contours.csproj", "{7E596777-ED3F-4BFC-B381-F94421A2EAFB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.RTConvert.Common", "Microsoft.RTConvert.Common\Microsoft.RTConvert.Common.csproj", "{3D61E6E2-008F-4DF7-AAC4-DAED31E8F52B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.RTConvert.Models", "Microsoft.RTConvert.Models\Microsoft.RTConvert.Models.csproj", "{F7E48FEF-F73F-410B-BE65-C82B738FAEED}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.RTConvert.MedIO.Tests", "Microsoft.RTConvert.MedIO.Tests\Microsoft.RTConvert.MedIO.Tests.csproj", "{9AD9F800-9F15-48E8-8CFD-BF44B8F80FC2}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.RTConvert.Contours.Tests", "Microsoft.RTConvert.Contours.Tests\Microsoft.RTConvert.Contours.Tests.csproj", "{FE127429-2ED2-4044-895C-E4468B5FE480}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.RTConvert.Converters.Tests", "Microsoft.RTConvert.Converters.Tests\Microsoft.RTConvert.Converters.Tests.csproj", "{370C9EF3-83BE-4299-A40F-6FA09419367F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.RTConvert.Console", "Microsoft.RTConvert.Console\Microsoft.RTConvert.Console.csproj", "{62FD1A01-5987-49F1-B5F4-67BFA7746513}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{E7A422A4-D253-4995-8E2C-34662336A3EA}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1E0B744B-77A3-4D47-910A-E14FDCD3B824}.Debug|x64.ActiveCfg = Debug|x64
{1E0B744B-77A3-4D47-910A-E14FDCD3B824}.Debug|x64.Build.0 = Debug|x64
{1E0B744B-77A3-4D47-910A-E14FDCD3B824}.Release|x64.ActiveCfg = Release|x64
{1E0B744B-77A3-4D47-910A-E14FDCD3B824}.Release|x64.Build.0 = Release|x64
{6E6787B0-8519-4347-A740-8C01EB63BBA9}.Debug|x64.ActiveCfg = Debug|x64
{6E6787B0-8519-4347-A740-8C01EB63BBA9}.Debug|x64.Build.0 = Debug|x64
{6E6787B0-8519-4347-A740-8C01EB63BBA9}.Release|x64.ActiveCfg = Release|x64
{6E6787B0-8519-4347-A740-8C01EB63BBA9}.Release|x64.Build.0 = Release|x64
{7E596777-ED3F-4BFC-B381-F94421A2EAFB}.Debug|x64.ActiveCfg = Debug|x64
{7E596777-ED3F-4BFC-B381-F94421A2EAFB}.Debug|x64.Build.0 = Debug|x64
{7E596777-ED3F-4BFC-B381-F94421A2EAFB}.Release|x64.ActiveCfg = Release|x64
{7E596777-ED3F-4BFC-B381-F94421A2EAFB}.Release|x64.Build.0 = Release|x64
{3D61E6E2-008F-4DF7-AAC4-DAED31E8F52B}.Debug|x64.ActiveCfg = Debug|x64
{3D61E6E2-008F-4DF7-AAC4-DAED31E8F52B}.Debug|x64.Build.0 = Debug|x64
{3D61E6E2-008F-4DF7-AAC4-DAED31E8F52B}.Release|x64.ActiveCfg = Release|x64
{3D61E6E2-008F-4DF7-AAC4-DAED31E8F52B}.Release|x64.Build.0 = Release|x64
{F7E48FEF-F73F-410B-BE65-C82B738FAEED}.Debug|x64.ActiveCfg = Debug|x64
{F7E48FEF-F73F-410B-BE65-C82B738FAEED}.Debug|x64.Build.0 = Debug|x64
{F7E48FEF-F73F-410B-BE65-C82B738FAEED}.Release|x64.ActiveCfg = Release|x64
{F7E48FEF-F73F-410B-BE65-C82B738FAEED}.Release|x64.Build.0 = Release|x64
{9AD9F800-9F15-48E8-8CFD-BF44B8F80FC2}.Debug|x64.ActiveCfg = Debug|x64
{9AD9F800-9F15-48E8-8CFD-BF44B8F80FC2}.Debug|x64.Build.0 = Debug|x64
{9AD9F800-9F15-48E8-8CFD-BF44B8F80FC2}.Release|x64.ActiveCfg = Release|x64
{9AD9F800-9F15-48E8-8CFD-BF44B8F80FC2}.Release|x64.Build.0 = Release|x64
{FE127429-2ED2-4044-895C-E4468B5FE480}.Debug|x64.ActiveCfg = Debug|x64
{FE127429-2ED2-4044-895C-E4468B5FE480}.Debug|x64.Build.0 = Debug|x64
{FE127429-2ED2-4044-895C-E4468B5FE480}.Release|x64.ActiveCfg = Release|x64
{FE127429-2ED2-4044-895C-E4468B5FE480}.Release|x64.Build.0 = Release|x64
{370C9EF3-83BE-4299-A40F-6FA09419367F}.Debug|x64.ActiveCfg = Debug|x64
{370C9EF3-83BE-4299-A40F-6FA09419367F}.Debug|x64.Build.0 = Debug|x64
{370C9EF3-83BE-4299-A40F-6FA09419367F}.Release|x64.ActiveCfg = Release|x64
{370C9EF3-83BE-4299-A40F-6FA09419367F}.Release|x64.Build.0 = Release|x64
{62FD1A01-5987-49F1-B5F4-67BFA7746513}.Debug|x64.ActiveCfg = Debug|x64
{62FD1A01-5987-49F1-B5F4-67BFA7746513}.Debug|x64.Build.0 = Debug|x64
{62FD1A01-5987-49F1-B5F4-67BFA7746513}.Release|x64.ActiveCfg = Release|x64
{62FD1A01-5987-49F1-B5F4-67BFA7746513}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{9AD9F800-9F15-48E8-8CFD-BF44B8F80FC2} = {E7A422A4-D253-4995-8E2C-34662336A3EA}
{FE127429-2ED2-4044-895C-E4468B5FE480} = {E7A422A4-D253-4995-8E2C-34662336A3EA}
{370C9EF3-83BE-4299-A40F-6FA09419367F} = {E7A422A4-D253-4995-8E2C-34662336A3EA}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {18E5F44A-1E7F-4A64-8214-2BBC418BC0F4}
EndGlobalSection
EndGlobal

Просмотреть файл

@ -0,0 +1,48 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
namespace Microsoft.RTConvert.Common
{
using System;
using System.Collections.Generic;
using Dicom;
/// <summary>
/// Channel id and files
/// </summary>
public class ChannelData
{
/// <summary>
/// Initializes a new instance of the <see cref="ChannelData"/> class.
/// </summary>
/// <param name="channelID">The channel identifier.</param>
/// <param name="dicomFiles">The dicom files.</param>
/// <exception cref="ArgumentNullException">
/// channelId
/// or
/// dicomFiles
/// </exception>
public ChannelData(string channelID, IEnumerable<DicomFile> dicomFiles)
{
ChannelID = channelID ?? throw new ArgumentNullException(nameof(channelID));
DicomFiles = dicomFiles ?? throw new ArgumentNullException(nameof(dicomFiles));
}
/// <summary>
/// Gets the channel identifier.
/// </summary>
/// <value>
/// The channel identifier.
/// </value>
public string ChannelID { get; }
/// <summary>
/// Gets the dicom files.
/// </summary>
/// <value>
/// The dicom files.
/// </value>
public IEnumerable<DicomFile> DicomFiles { get; }
}
}

Просмотреть файл

@ -0,0 +1,67 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
namespace Microsoft.RTConvert.Common
{
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Helpers;
using Microsoft.RTConvert.MedIO.Readers;
/// <summary>
/// Helper methods to deserialize segmentation data
/// </summary>
public static class DicomZipSeries
{
/// <summary>
/// Deserializes a compressed zip with dicom files
/// </summary>
/// <param name="compressedData"></param>
/// <returns></returns>
public static IEnumerable<(string ChannelId, DicomFolderContents Content)> DecompressSegmentationData(byte[] compressedData)
{
using (var memoryStream = new MemoryStream(compressedData))
{
return DecompressSegmentationData(memoryStream);
}
}
/// <summary>
/// Decompresses the segmentation data from an input stream containing zipped Dicom files.
/// </summary>
/// <param name="inputStream">The input stream.</param>
/// <returns></returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]
public static IEnumerable<(string ChannelId, DicomFolderContents Content)> DecompressSegmentationData(Stream inputStream)
{
var files = DicomCompressionHelpers.DecompressPayload(inputStream);
var dictionaryChannelToFiles = new Dictionary<string, List<byte[]>>();
foreach ((string filename, byte[] data) in files)
{
var channelId = filename.Split(DicomCompressionHelpers.ChannelIdAndDicomSeriesSeparator).First();
if (!dictionaryChannelToFiles.ContainsKey(channelId))
{
dictionaryChannelToFiles.Add(channelId, new List<byte[]>());
}
dictionaryChannelToFiles[channelId].Add(data);
}
var result = new List<(string ChannelId, DicomFolderContents content)>();
foreach (var item in dictionaryChannelToFiles)
{
var fileAndPaths = item.Value
.Select(x => DicomFileAndPath.SafeCreate(new MemoryStream(x), string.Empty))
.ToList();
result.Add((item.Key, DicomFolderContents.Build(fileAndPaths)));
}
return result;
}
}
}

Просмотреть файл

@ -0,0 +1,218 @@
/// ------------------------------------------------------------------------------------------
/// Copyright (c) Microsoft Corporation. All rights reserved.
/// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information.
/// ------------------------------------------------------------------------------------------
namespace Microsoft.RTConvert.Common
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
public static class Extensions
{
/// <summary>
/// Applies the provided function to all items in the dictionary in place
/// </summary>
public static void MapInPlace<TKey, TVal>(this IDictionary<TKey, TVal> dictionary, Func<TVal, TVal> func)
{
foreach (var k in dictionary.Keys.ToList())
{
dictionary[k] = func(dictionary[k]);
}
}
/// <summary>
/// Maps the provided value to be between [min,max] range
/// </summary>
public static double Clamp(this double val, double min, double max)
{
if(max < min)
{
throw new ArgumentException($"Could not clamp {val}, to bounds [{min},{max}] as max < min");
}
else
{
return val < min ? min : (val > max ? max : val);
}
}
/// <summary>
/// Enumerates 2 sequences at the same time, and calls the action on matching sequence elements.
/// </summary>
/// <typeparam name="TFirst"></typeparam>
/// <typeparam name="TSecond"></typeparam>
/// <param name="first"></param>
/// <param name="second"></param>
/// <param name="action"></param>
public static void Pairwise<TFirst, TSecond>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Action<TFirst, TSecond> action)
{
using (var e1 = first.GetEnumerator())
{
using (var e2 = second.GetEnumerator())
{
while (e1.MoveNext() && e2.MoveNext())
{
action.Invoke(e1.Current, e2.Current);
}
}
}
}
/// <summary>
/// Creates an enumerable that contains the argument as its single element.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public static IEnumerable<T> Singleton<T>(T obj)
{
yield return obj;
}
/// <summary>
/// Returns an enumerable of indices of the array or enumerable, starting at 0.
/// CAUTION: The method creates some performance overhead.
/// Do not use for large arrays, like those inside Volume3D.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <returns></returns>
public static IEnumerable<int> Indices<T>(this IEnumerable<T> seq)
{
if (seq is Array array)
{
var count = array.Length;
for (var index = 0; index < count; index++)
{
yield return index;
}
}
else
{
var position = 0;
foreach (var _ in seq)
{
yield return position;
position++;
}
}
}
/// <summary>
/// Returns true if the array is either null or has no elements.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="array"></param>
/// <returns></returns>
public static bool IsNullOrEmpty<T>(this T[] array)
{
return array == null || array.Length == 0;
}
/// <summary>
/// Returns true if the list is either null or has no elements.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static bool IsNullOrEmpty<T>(this List<T> list)
{
return list == null || list.Count == 0;
}
/// <summary>
/// Permutes the array in-place, using the given random number generator, by swapping
/// array elements at random positions.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="array"></param>
/// <param name="rng"></param>
public static void Shuffle<T>(this T[] array, Random rng)
{
int n = array.Length;
while (n > 1)
{
int k = rng.Next(n--);
T temp = array[n];
array[n] = array[k];
array[k] = temp;
}
}
public static void PartialShuffle<T>(this T[] array, Random rng, int lastIndex)
{
int i = -1;
int n = array.Length;
int index = lastIndex < n ? lastIndex : (n - 1);
while (i < index)
{
int k = rng.Next(++i, n);
T temp = array[i];
array[i] = array[k];
array[k] = temp;
}
}
/// <summary>
/// Runs a parallel 'for' loop over the input array. The given function is called with an array
/// element and its index as arguments. The returned array contains the function results
/// across the whole loop.
/// </summary>
/// <typeparam name="TIn"></typeparam>
/// <typeparam name="TOut"></typeparam>
/// <param name="array"></param>
/// <param name="func"></param>
/// <returns></returns>
public static TOut[] ParallelSelect<TIn,TOut>(this TIn[] array, Func<TIn,int,TOut> func)
{
var result = new TOut[array.Length];
Parallel.For(
0,
array.Length,
index =>
{
result[index] = func(array[index], index);
});
return result;
}
/// <summary>
/// Runs a parallel 'for' loop over the input array. The given function is called with an
/// element of the input array. The returned array contains the function results
/// across the whole loop.
/// </summary>
/// <typeparam name="TIn"></typeparam>
/// <typeparam name="TOut"></typeparam>
/// <param name="array"></param>
/// <param name="func"></param>
/// <returns></returns>
public static TOut[] ParallelSelect<TIn, TOut>(this TIn[] array, Func<TIn, TOut> func)
{
var result = new TOut[array.Length];
Parallel.For(
0,
array.Length,
index =>
{
result[index] = func(array[index]);
});
return result;
}
/// <summary>
/// Returns an emumerable with all values that are contained more than 1 time in the input sequence.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="values"></param>
/// <returns></returns>
public static IEnumerable<T> Duplicates<T>(this IEnumerable<T> values) =>
(values ?? throw new ArgumentNullException(nameof(values)))
.GroupBy(value => value)
.Where(group => group.Count() > 1)
.Select(group => group.Key);
}
}

Просмотреть файл

@ -0,0 +1,313 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
namespace Microsoft.RTConvert.Common.Helpers
{
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.IO.Compression;
using Dicom;
/// <summary>
/// DICOM compression helpers.
/// </summary>
public static class DicomCompressionHelpers
{
/// <summary>
/// The channel identifier and dicom series separator.
/// </summary>
public const char ChannelIdAndDicomSeriesSeparator = '/';
/// <summary>
/// The default compression level.
/// </summary>
public static readonly CompressionLevel DefaultCompressionLevel = CompressionLevel.Optimal;
/// <summary>
/// Decompresses a collection of ZIP archive entry streams from the compressed stream.
/// </summary>
/// <param name="compressedData">The compressed data stream.</param>
/// <returns>The decompressed array of streams.</returns>
/// <exception cref="ArgumentNullException">If the compressed data stream is null.</exception>
public static IReadOnlyList<Stream> DecompressStreams(Stream compressedData)
{
compressedData = compressedData ?? throw new ArgumentNullException(nameof(compressedData));
using (var zipArchive = new ZipArchive(compressedData, ZipArchiveMode.Read, leaveOpen: true))
{
var result = new List<Stream>(zipArchive.Entries.Count);
for (var i = 0; i < zipArchive.Entries.Count; i++)
{
result.Add(CreateStream(zipArchive.Entries[i]));
}
return result;
}
}
/// <summary>
/// Disposes of a collection of streams.
/// </summary>
/// <param name="streams">The streams collection.</param>
/// <exception cref="ArgumentNullException">The collection of streams is null.</exception>
public static void Dispose(this IReadOnlyList<Stream> streams)
{
streams = streams ?? throw new ArgumentNullException(nameof(streams));
foreach (var stream in streams)
{
stream.Dispose();
}
}
/// <summary>
/// Opens the ZIP archive entry, copies the stream to the provided file stream, and returns a new DICOM file instance.
/// Note: The FO-DICOM DicomFile will not read tags from the stream >64KB. Therefore, to read a tag (such as pixel data)
/// the dicomFileStream must be left open.
/// </summary>
/// <param name="zipArchiveEntry">The ZIP archive entry.</param>
/// <param name="dicomFileStream">The DICOM file stream.</param>
/// <returns>The DICOM file.</returns>
/// <exception cref="ArgumentNullException">If the zip archive entry or DICOM file stream is null.</exception>
public static DicomFile OpenDicomFile(this ZipArchiveEntry zipArchiveEntry, Stream dicomFileStream)
{
zipArchiveEntry = zipArchiveEntry ?? throw new ArgumentNullException(nameof(zipArchiveEntry));
dicomFileStream = dicomFileStream ?? throw new ArgumentNullException(nameof(dicomFileStream));
using (var entryStream = zipArchiveEntry.Open())
{
entryStream.CopyTo(dicomFileStream);
}
dicomFileStream.Seek(0, SeekOrigin.Begin);
return DicomFile.Open(dicomFileStream);
}
/// <summary>
/// Creates a new memory stream from a ZIP archive entry.
/// </summary>
/// <param name="zipArchiveEntry">The ZIP archive entry.</param>
/// <returns>The new memory stream from the ZIP archive entry.</returns>
/// <exception cref="ArgumentNullException">If the zip archive entry is null.</exception>
[SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "Resulting stream is returned to caller to dispose.")]
public static Stream CreateStream(this ZipArchiveEntry zipArchiveEntry)
{
zipArchiveEntry = zipArchiveEntry ?? throw new ArgumentNullException(nameof(zipArchiveEntry));
var memoryStream = new MemoryStream();
try
{
using (var entryStream = zipArchiveEntry.Open())
{
entryStream.CopyTo(memoryStream);
}
memoryStream.Seek(0, SeekOrigin.Begin);
MemoryStream result = memoryStream;
memoryStream = null;
return result;
}
finally
{
memoryStream?.Dispose();
}
}
/// <summary>
/// Zips and serializes dicom files.
/// </summary>
/// <param name="channels">The channels.</param>
/// <param name="compressionLevel">The compression level.</param>
/// <returns></returns>
[SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times")]
public static byte[] CompressDicomFiles(
IEnumerable<ChannelData> channels,
CompressionLevel compressionLevel)
{
channels = channels ?? throw new ArgumentNullException(nameof(channels));
using (var memoryStream = new MemoryStream())
{
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create))
{
var fileIndex = 0;
foreach (var channel in channels)
{
foreach (var file in channel.DicomFiles)
{
var archiveEntry = archive.CreateEntry(
$"{channel.ChannelID}{ChannelIdAndDicomSeriesSeparator}{fileIndex++}",
compressionLevel);
SaveDicomToArchive(file, archiveEntry);
}
}
}
return memoryStream.ToArray();
}
}
/// <summary>
/// Compresses the dicom files to a stream.
/// </summary>
/// <param name="stream">The stream to compress the DICOM files to.</param>
/// <param name="dicomFiles">The dicom files.</param>
public static void CompressDicomFilesToStream(Stream stream, params DicomFile[] dicomFiles)
{
CompressDicomFilesToStream(stream, (IEnumerable<DicomFile>)dicomFiles);
}
/// <summary>
/// Compresses the dicom files to a stream.
/// </summary>
/// <param name="stream">The stream to compress the DICOM files to.</param>
/// <param name="dicomFiles">The dicom files.</param>
public static void CompressDicomFilesToStream(Stream stream, IEnumerable<DicomFile> dicomFiles)
{
// Note: we must leave the stream open here as we do not own the stream.
CompressDicomFilesToStream(dicomFiles, stream, DefaultCompressionLevel, leaveStreamOpen: true);
}
/// <summary>
/// Compresses the dicom files to a zip archive and returns a byte array.
/// </summary>
/// <param name="dicomFiles">The dicom files.</param>
/// <returns>The compressed Dicom files.</returns>
public static byte[] CompressDicomFiles(IEnumerable<DicomFile> dicomFiles)
{
return CompressDicomFiles(DefaultCompressionLevel, dicomFiles);
}
/// <summary>
/// Compresses the dicom files to a zip archive and returns a byte array.
/// </summary>
/// <param name="dicomFiles">The dicom files.</param>
/// <returns>The compressed Dicom files.</returns>
public static byte[] CompressDicomFiles(params DicomFile[] dicomFiles)
{
return CompressDicomFiles(DefaultCompressionLevel, dicomFiles);
}
/// <summary>
/// Compresses the dicom files to a zip archive and returns a byte array.
/// </summary>
/// <param name="compressionLevel">The compression level.</param>
/// <param name="dicomFiles">The dicom files.</param>
/// <returns>The compressed Dicom files.</returns>
public static byte[] CompressDicomFiles(CompressionLevel compressionLevel, params DicomFile[] dicomFiles)
{
return CompressDicomFiles(compressionLevel, (IEnumerable<DicomFile>)dicomFiles);
}
/// <summary>
/// Compresses the dicom files to a zip archive and returns a byte array.
/// </summary>
/// <param name="compressionLevel">The compression level.</param>
/// <param name="dicomFiles">The dicom files.</param>
/// <returns>The compressed Dicom files.</returns>
public static byte[] CompressDicomFiles(CompressionLevel compressionLevel, IEnumerable<DicomFile> dicomFiles)
{
dicomFiles = dicomFiles ?? throw new ArgumentNullException(nameof(dicomFiles));
using (var memoryStream = new MemoryStream())
{
CompressDicomFilesToStream(dicomFiles, memoryStream, compressionLevel, leaveStreamOpen: false);
return memoryStream.ToArray();
}
}
/// <summary>
/// The input byte[] containing zip file contents is deflated.
/// Resulting file names and their contents are returned.
/// </summary>
[SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times")]
public static IEnumerable<(string FileName, byte[] Data)> DecompressPayload(byte[] data)
{
data = data ?? throw new ArgumentNullException(nameof(data));
using (var memoryStream = new MemoryStream(data))
{
return DecompressPayload(memoryStream);
}
}
/// <summary>
/// The input stream containing zip file contents is deflated.
/// Resulting file names and their contents are returned.
/// </summary>
[SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times")]
public static IEnumerable<(string FileName, byte[] Data)> DecompressPayload(Stream inputStream)
{
inputStream = inputStream ?? throw new ArgumentNullException(nameof(inputStream));
using (var archive = new ZipArchive(inputStream, ZipArchiveMode.Read))
{
foreach (var archiveEntry in archive.Entries)
{
yield return (archiveEntry.FullName, ToByteArray(archiveEntry));
}
}
}
/// <summary>
/// Compresses the DICOM files to a stream.
/// </summary>
/// <param name="stream">The stream.</param>
/// <param name="compressionLevel">The compression level.</param>
/// <param name="leaveStreamOpen">If the stream should be left open.</param>
/// <param name="dicomFiles">The dicom files.</param>
private static void CompressDicomFilesToStream(
IEnumerable<DicomFile> dicomFiles,
Stream stream,
CompressionLevel compressionLevel,
bool leaveStreamOpen)
{
using (var archive = new ZipArchive(stream, ZipArchiveMode.Create, leaveStreamOpen))
{
var fileIndex = 0;
foreach (var file in dicomFiles)
{
SaveDicomToArchive(file, archive.CreateEntry($"{fileIndex++}", compressionLevel));
}
}
}
/// <summary>
/// Saves the dicom file to a zip archive entry.
/// </summary>
/// <param name="dicomFile">The dicom file.</param>
/// <param name="zipArchiveEntry">The zip archive entry.</param>
[SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
private static void SaveDicomToArchive(DicomFile dicomFile, ZipArchiveEntry zipArchiveEntry)
{
using (var entryStream = zipArchiveEntry.Open())
{
dicomFile.Save(entryStream);
}
}
/// <summary>
/// Read the contents of ziparchiveentry and return them as a byte array.
/// </summary>
/// <param name="entry">The zip archive entry.</param>
/// <returns>The entry contents as a byte array.</returns>
private static byte[] ToByteArray(ZipArchiveEntry entry)
{
using (var entryStream = entry.Open())
{
using (var memoryStream = new MemoryStream())
{
entryStream.CopyTo(memoryStream);
return memoryStream.ToArray();
}
}
}
}
}

Просмотреть файл

@ -0,0 +1,78 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
namespace Microsoft.RTConvert.Common.Helpers
{
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.RTConvert.MedIO;
using Microsoft.RTConvert.MedIO.Models;
using Microsoft.RTConvert.MedIO.Readers;
/// <summary>
/// Helper methods for extracting volumes from packaged DICOM files.
/// </summary>
public sealed class DicomSeriesHelpers
{
/// <summary>
/// Given a compressed package of DICOM data, reads MedicalVolumes from the package.
/// </summary>
/// <param name="compressedData"></param>
/// <returns></returns>
public static IReadOnlyDictionary<string, MedicalVolume> LoadCompressedImageSeries(byte[] compressedData)
{
var dicomFolders = DicomZipSeries.DecompressSegmentationData(compressedData);
var result = new Dictionary<string, MedicalVolume>();
foreach (var (channelId, content) in dicomFolders)
{
result.Add(channelId, LoadVolume(content));
}
return result;
}
/// <summary>
/// Build a MedicalVolume from a DicomFolderContents instance
/// </summary>
/// <param name="dicomFolder"></param>
/// <returns></returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes")]
public static MedicalVolume LoadVolume(DicomFolderContents dicomFolder)
{
dicomFolder = dicomFolder ?? throw new ArgumentNullException(nameof(dicomFolder));
var volumeLoaderResult = MedIO.LoadAllDicomSeries(
dicomFolder,
new ModerateGeometricAcceptanceTest("Non Square pixels", "Unsupported Orientation"),
loadStructuresIfExists: false,
supportLossyCodecs: false);
if (volumeLoaderResult.Count > 1)
{
throw new Exception($"More than 1 volume loaded for path {dicomFolder.FolderPath}");
}
var volumeLoaderFirstResult = volumeLoaderResult.First();
if (volumeLoaderFirstResult.Error != null)
{
throw volumeLoaderFirstResult.Error;
}
if (volumeLoaderFirstResult.Warnings != null && volumeLoaderFirstResult.Warnings.Count > 0)
{
throw new Exception(string.Join(",", volumeLoaderFirstResult.Warnings));
}
return volumeLoaderFirstResult.Volume;
}
private DicomSeriesHelpers()
{
}
}
}

Просмотреть файл

@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
<Platforms>x64</Platforms>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Microsoft.RTConvert.MedIO\Microsoft.RTConvert.MedIO.csproj" />
</ItemGroup>
</Project>

Просмотреть файл

@ -0,0 +1,41 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
namespace Microsoft.RTConvert.Common.Models
{
using System;
using System.Collections.Generic;
using Microsoft.RTConvert.Models;
/// <summary>
/// Lookup table for structure name to RGB color
/// </summary>
[Serializable]
public class StructureColor
{
/// <summary>
/// Constructor
/// </summary>
/// <param name="structureToColor"></param>
public StructureColor(Dictionary<string, RGBColor> structureToColor)
{
StructureToColor = structureToColor ?? throw new ArgumentNullException(nameof(structureToColor));
}
/// <summary>
/// Gets the dictionary map
/// </summary>
public Dictionary<string, RGBColor> StructureToColor { get; }
/// <summary>
/// Extract a colour from the map by structure name
/// </summary>
/// <param name="key"></param>
/// <param name="color"></param>
/// <returns></returns>
public bool TryGetValue(string key, out RGBColor color)
{
return StructureToColor.TryGetValue(key, out color);
}
}
}

Просмотреть файл

@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
<Platforms>x64</Platforms>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CommandLineParser" Version="2.8.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Microsoft.RTConvert.Common\Microsoft.RTConvert.Common.csproj" />
<ProjectReference Include="..\Microsoft.RTConvert.Converters\Microsoft.RTConvert.Converters.csproj" />
<ProjectReference Include="..\Microsoft.RTConvert.MedIO\Microsoft.RTConvert.MedIO.csproj" />
</ItemGroup>
</Project>

Просмотреть файл

@ -0,0 +1,152 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
namespace Microsoft.RTConvert.Console
{
using System;
using System.Collections.Generic;
using System.Linq;
using CommandLine;
using CommandLine.Text;
using Microsoft.RTConvert.Converters;
class Options
{
/// <summary>
/// Path to file on disk containing input NIFTI file.
/// </summary>
[Option('i', "in-file", Required = true, HelpText = "Path to the input Nifti file.")]
public string InFile { get; set; }
/// <summary>
/// Path to folder on disk containing reference DICOM series.
/// </summary>
[Option('r', "reference-series", Required = true, HelpText = "Path to the input folder containing the reference DICOM series.")]
public string ReferenceSeries { get; set; }
/// <summary>
/// Output DICOM-RT files.
/// </summary>
[Option('o', "out-file", Required = true, HelpText = "Path to the output DICOM-RT file.")]
public string OutFile { get; set; }
/// <summary>
/// List of structure names.
/// </summary>
[Option('n', "struct-names", Required = true, HelpText = "List of comma separated structure names.")]
public string StructureNames { get; set; }
/// <summary>
/// List of structure colors.
/// </summary>
[Option('c', "struct-colors", Required = true, HelpText = "List of comma separated structure colors in hexadecimal notation.")]
public string StructureColors { get; set; }
/// <summary>
/// List of fill hole flags.
/// </summary>
[Option('f', "fill-holes", Required = true, HelpText = "List of comma separated flags, whether to fill holes in the structure.")]
public string FillHoles { get; set; }
/// <summary>
/// List of ROIInterpretedTypes. Possible values (None, CTV, ORGAN, EXTERNAL)
/// </summary>
[Option('t', "roi-interpreted-types", Required = true, HelpText = "List of comma separated strings specifiying the ROIInterpretedTypes for each structure. Possible values (None, CTV, ORGAN, EXTERNAL).")]
public string ROIInterpretedTypes { get; set; }
/// <summary>
/// Manufacturer
/// </summary>
[Option('m', "manufacturer", Required = true, HelpText = "Manufacturer for the DICOM-RT")]
public string Manufacturer { get; set; }
/// <summary>
/// Interpreter
/// </summary>
[Option('t', "interpreter", Required = true, HelpText = "Interpreter for the DICOM-RT")]
public string Interpreter { get; set; }
/// <summary>
/// Model name and version
/// </summary>
[Option('d', "modelId", Required = true, HelpText = "Model name and version. This will be added to the SoftwareVersions in DICOM-RT")]
public string ModelNameAndVersion { get; set; }
[Usage(ApplicationAlias = "dotnet Microsoft.RTConvert.Console.dll")]
public static IEnumerable<Example> Examples
{
get
{
return new List<Example>() {
new Example("Convert segmentation file in Nifti format, and reference DICOM series to file in DICOM-RT format", new Options {
InFile = "data/segmentation.nii.gz",
ReferenceSeries = "data/dicom",
OutFile = "out.dcm",
StructureNames = "External, parotid_l, parotid_r, smg_l",
StructureColors = "000000, FF0080, 00FF00, 0000FF",
FillHoles = "True, False, True",
ROIInterpretedTypes= "Organ, CTV, External",
ModelNameAndVersion = "ModelXYZ:234",
Manufacturer = "Contoso",
Interpreter = "AI"
})
};
}
}
}
class Program
{
static int Main(string[] args)
{
if (args is null)
{
args = new string[] { };
}
var result = Parser.Default.ParseArguments<Options>(args).MapResult(
(opts) => RunOptionsAndReturnExitCode(opts), //in case parser sucess
errs => HandleParseError(errs));
return result;
}
/// <summary>
/// Handle options, if no errors.
/// </summary>
/// <param name="opts">Command line options</param>
/// <returns>Exit code.</returns>
static int RunOptionsAndReturnExitCode(Options opts)
{
try
{
RTConverters.ConvertNiftiToDicom(opts.InFile, opts.ReferenceSeries, opts.StructureNames,
opts.StructureColors, opts.FillHoles, opts.ROIInterpretedTypes, opts.OutFile, opts.ModelNameAndVersion, opts.Manufacturer, opts.Interpreter);
Console.WriteLine($"Successfully written {opts.OutFile}");
}
catch (Exception e)
{
Console.Error.WriteLine($"Error while processing: {e}");
return 1;
}
return 0;
}
/// <summary>
/// Handle options errors, --help, or --version.
/// </summary>
/// <param name="errs">List of errors.</param>
/// <returns>Exit code.</returns>
static int HandleParseError(IEnumerable<Error> errs)
{
var result = -2;
Console.WriteLine("errors {0}", errs.Count());
if (errs.Any(x => x is HelpRequestedError || x is VersionRequestedError))
result = -1;
return result;
}
}
}

Просмотреть файл

@ -0,0 +1,8 @@
{
"profiles": {
"Microsoft.RTConvert.Console": {
"commandName": "Project",
"commandLineArgs": "--in-file ..\\..\\..\\..\\..\\Microsoft.RTConvert.Converters.Tests\\TestData\\hnsegmentation.nii.gz --reference-series ..\\..\\..\\..\\..\\Microsoft.RTConvert.Converters.Tests\\TestData\\HN --out-file ofile.dcm --struct-colors \"0000FF, 00FF00, FFFF00\" --struct-names \"SPC, MPC, mandible\" --fill-holes \"True, False, false\""
}
}
}

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:57b6a1b6c56da07fb780e656c22caa954819567b2e9f28edec3c5d3ec0f8951b
size 4146

Просмотреть файл

@ -0,0 +1,196 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.DrawLine(tickPen, 28, 230, 32, 230);
g.DrawString(10, tickFont, tickBrush, 20, 230, sf);
g.DrawLine(tickPen, 28, 330, 32, 330);
g.DrawString(15, tickFont, tickBrush, 20, 330, sf);
g.FillRectangle(maskBrush, 45, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 28, 4, 4);
g.FillRectangle(maskBrush, 65, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 28, 4, 4);
g.FillRectangle(maskBrush, 85, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 28, 4, 4);
g.FillRectangle(maskBrush, 105, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 28, 4, 4);
g.FillRectangle(maskBrush, 125, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 28, 4, 4);
g.FillRectangle(maskBrush, 145, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 28, 4, 4);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 105, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 145, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 65, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 68, 4, 4);
g.FillRectangle(maskBrush, 125, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 68, 4, 4);
g.FillRectangle(maskBrush, 145, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 88, 4, 4);
g.FillRectangle(maskBrush, 65, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 88, 4, 4);
g.FillRectangle(maskBrush, 125, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 88, 4, 4);
g.FillRectangle(maskBrush, 145, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 88, 4, 4);
g.FillRectangle(maskBrush, 45, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 108, 4, 4);
g.FillRectangle(maskBrush, 65, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 108, 4, 4);
g.FillRectangle(maskBrush, 85, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 108, 4, 4);
g.FillRectangle(maskBrush, 105, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 108, 4, 4);
g.FillRectangle(maskBrush, 125, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 108, 4, 4);
g.FillRectangle(maskBrush, 145, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 108, 4, 4);
g.FillRectangle(maskBrush, 45, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 128, 4, 4);
g.FillRectangle(maskBrush, 65, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 128, 4, 4);
g.FillRectangle(maskBrush, 85, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 128, 4, 4);
g.FillRectangle(maskBrush, 105, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 128, 4, 4);
g.FillRectangle(maskBrush, 125, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 128, 4, 4);
g.FillRectangle(maskBrush, 145, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 128, 4, 4);
g.FillRectangle(maskBrush, 45, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 148, 4, 4);
g.FillRectangle(maskBrush, 65, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 148, 4, 4);
g.FillRectangle(maskBrush, 105, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 148, 4, 4);
g.FillRectangle(maskBrush, 125, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 148, 4, 4);
g.FillRectangle(maskBrush, 145, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 148, 4, 4);
g.FillRectangle(maskBrush, 45, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 168, 4, 4);
g.FillRectangle(maskBrush, 65, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 168, 4, 4);
g.FillRectangle(maskBrush, 125, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 168, 4, 4);
g.FillRectangle(maskBrush, 145, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 168, 4, 4);
g.FillRectangle(maskBrush, 45, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 188, 4, 4);
g.FillRectangle(maskBrush, 65, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 188, 4, 4);
g.FillRectangle(maskBrush, 85, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 188, 4, 4);
g.FillRectangle(maskBrush, 105, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 188, 4, 4);
g.FillRectangle(maskBrush, 125, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 188, 4, 4);
g.FillRectangle(maskBrush, 145, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 188, 4, 4);
g.FillRectangle(maskBrush, 45, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 208, 4, 4);
g.FillRectangle(maskBrush, 65, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 208, 4, 4);
g.FillRectangle(maskBrush, 85, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 208, 4, 4);
g.FillRectangle(maskBrush, 105, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 208, 4, 4);
g.FillRectangle(maskBrush, 125, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 208, 4, 4);
g.FillRectangle(maskBrush, 145, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 208, 4, 4);
g.FillRectangle(maskBrush, 45, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 248, 4, 4);
g.FillRectangle(maskBrush, 65, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 248, 4, 4);
g.FillRectangle(maskBrush, 85, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 248, 4, 4);
g.FillRectangle(maskBrush, 105, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 248, 4, 4);
g.FillRectangle(maskBrush, 125, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 248, 4, 4);
g.FillRectangle(maskBrush, 145, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 248, 4, 4);
g.FillRectangle(maskBrush, 45, 265, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 268, 4, 4);
g.FillRectangle(maskBrush, 65, 265, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 268, 4, 4);
g.FillRectangle(maskBrush, 85, 265, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 268, 4, 4);
g.FillRectangle(maskBrush, 105, 265, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 268, 4, 4);
g.FillRectangle(maskBrush, 125, 265, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 268, 4, 4);
g.FillRectangle(maskBrush, 145, 265, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 268, 4, 4);
g.FillRectangle(maskBrush, 45, 285, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 288, 4, 4);
g.FillRectangle(maskBrush, 65, 285, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 288, 4, 4);
g.FillRectangle(maskBrush, 125, 285, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 288, 4, 4);
g.FillRectangle(maskBrush, 145, 285, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 288, 4, 4);
g.FillRectangle(maskBrush, 45, 305, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 308, 4, 4);
g.FillRectangle(maskBrush, 65, 305, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 308, 4, 4);
g.FillRectangle(maskBrush, 85, 305, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 308, 4, 4);
g.FillRectangle(maskBrush, 105, 305, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 308, 4, 4);
g.FillRectangle(maskBrush, 125, 305, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 308, 4, 4);
g.FillRectangle(maskBrush, 145, 305, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 308, 4, 4);
g.FillRectangle(maskBrush, 45, 325, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 328, 4, 4);
g.FillRectangle(maskBrush, 65, 325, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 328, 4, 4);
g.FillRectangle(maskBrush, 85, 325, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 328, 4, 4);
g.FillRectangle(maskBrush, 105, 325, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 328, 4, 4);
g.FillRectangle(maskBrush, 125, 325, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 328, 4, 4);
g.FillRectangle(maskBrush, 145, 325, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 328, 4, 4);
g.FillRectangle(maskBrush, 45, 345, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 348, 4, 4);
g.FillRectangle(maskBrush, 65, 345, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 348, 4, 4);
g.FillRectangle(maskBrush, 85, 345, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 348, 4, 4);
g.FillRectangle(maskBrush, 105, 345, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 348, 4, 4);
g.FillRectangle(maskBrush, 125, 345, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 348, 4, 4);
g.FillRectangle(maskBrush, 145, 345, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 348, 4, 4);
var path = new GraphicsPath([(60, 20),(90, 20),(90, 60),(80, 60),(80, 100),(90, 100),(90, 140),(80, 140),(80, 180),(120, 180),(120, 160),(100, 160),(100, 140),(90, 140),(90, 100),(120, 100),(120, 60),(90, 60),(90, 20),(160, 20),(160, 220),(40, 220),(40, 20)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 58, 18, 4, 4);
g.DrawEllipse(contourPen, 38, 18, 4, 4);
var path = new GraphicsPath([(60, 240),(90, 240),(90, 280),(80, 280),(80, 300),(120, 300),(120, 280),(90, 280),(90, 240),(160, 240),(160, 360),(40, 360),(40, 240)], [1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 58, 238, 4, 4);
g.DrawEllipse(contourPen, 38, 238, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7486c96aadf46003d6ac65672467d7b1209177577f02ca5ed44414e11f2ac2e3
size 5273

Просмотреть файл

@ -0,0 +1,196 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.DrawLine(tickPen, 28, 230, 32, 230);
g.DrawString(10, tickFont, tickBrush, 20, 230, sf);
g.DrawLine(tickPen, 28, 330, 32, 330);
g.DrawString(15, tickFont, tickBrush, 20, 330, sf);
g.FillRectangle(maskBrush, 45, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 28, 4, 4);
g.FillRectangle(maskBrush, 65, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 28, 4, 4);
g.FillRectangle(maskBrush, 85, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 28, 4, 4);
g.FillRectangle(maskBrush, 105, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 28, 4, 4);
g.FillRectangle(maskBrush, 125, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 28, 4, 4);
g.FillRectangle(maskBrush, 145, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 28, 4, 4);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 105, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 145, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 65, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 68, 4, 4);
g.FillRectangle(maskBrush, 125, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 68, 4, 4);
g.FillRectangle(maskBrush, 145, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 88, 4, 4);
g.FillRectangle(maskBrush, 65, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 88, 4, 4);
g.FillRectangle(maskBrush, 125, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 88, 4, 4);
g.FillRectangle(maskBrush, 145, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 88, 4, 4);
g.FillRectangle(maskBrush, 45, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 108, 4, 4);
g.FillRectangle(maskBrush, 65, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 108, 4, 4);
g.FillRectangle(maskBrush, 85, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 108, 4, 4);
g.FillRectangle(maskBrush, 105, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 108, 4, 4);
g.FillRectangle(maskBrush, 125, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 108, 4, 4);
g.FillRectangle(maskBrush, 145, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 108, 4, 4);
g.FillRectangle(maskBrush, 45, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 128, 4, 4);
g.FillRectangle(maskBrush, 65, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 128, 4, 4);
g.FillRectangle(maskBrush, 85, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 128, 4, 4);
g.FillRectangle(maskBrush, 105, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 128, 4, 4);
g.FillRectangle(maskBrush, 125, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 128, 4, 4);
g.FillRectangle(maskBrush, 145, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 128, 4, 4);
g.FillRectangle(maskBrush, 45, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 148, 4, 4);
g.FillRectangle(maskBrush, 65, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 148, 4, 4);
g.FillRectangle(maskBrush, 105, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 148, 4, 4);
g.FillRectangle(maskBrush, 125, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 148, 4, 4);
g.FillRectangle(maskBrush, 145, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 148, 4, 4);
g.FillRectangle(maskBrush, 45, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 168, 4, 4);
g.FillRectangle(maskBrush, 65, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 168, 4, 4);
g.FillRectangle(maskBrush, 125, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 168, 4, 4);
g.FillRectangle(maskBrush, 145, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 168, 4, 4);
g.FillRectangle(maskBrush, 45, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 188, 4, 4);
g.FillRectangle(maskBrush, 65, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 188, 4, 4);
g.FillRectangle(maskBrush, 85, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 188, 4, 4);
g.FillRectangle(maskBrush, 105, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 188, 4, 4);
g.FillRectangle(maskBrush, 125, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 188, 4, 4);
g.FillRectangle(maskBrush, 145, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 188, 4, 4);
g.FillRectangle(maskBrush, 45, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 208, 4, 4);
g.FillRectangle(maskBrush, 65, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 208, 4, 4);
g.FillRectangle(maskBrush, 85, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 208, 4, 4);
g.FillRectangle(maskBrush, 105, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 208, 4, 4);
g.FillRectangle(maskBrush, 125, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 208, 4, 4);
g.FillRectangle(maskBrush, 145, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 208, 4, 4);
g.FillRectangle(maskBrush, 45, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 248, 4, 4);
g.FillRectangle(maskBrush, 65, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 248, 4, 4);
g.FillRectangle(maskBrush, 85, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 248, 4, 4);
g.FillRectangle(maskBrush, 105, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 248, 4, 4);
g.FillRectangle(maskBrush, 125, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 248, 4, 4);
g.FillRectangle(maskBrush, 145, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 248, 4, 4);
g.FillRectangle(maskBrush, 45, 265, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 268, 4, 4);
g.FillRectangle(maskBrush, 65, 265, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 268, 4, 4);
g.FillRectangle(maskBrush, 85, 265, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 268, 4, 4);
g.FillRectangle(maskBrush, 105, 265, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 268, 4, 4);
g.FillRectangle(maskBrush, 125, 265, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 268, 4, 4);
g.FillRectangle(maskBrush, 145, 265, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 268, 4, 4);
g.FillRectangle(maskBrush, 45, 285, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 288, 4, 4);
g.FillRectangle(maskBrush, 65, 285, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 288, 4, 4);
g.FillRectangle(maskBrush, 125, 285, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 288, 4, 4);
g.FillRectangle(maskBrush, 145, 285, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 288, 4, 4);
g.FillRectangle(maskBrush, 45, 305, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 308, 4, 4);
g.FillRectangle(maskBrush, 65, 305, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 308, 4, 4);
g.FillRectangle(maskBrush, 85, 305, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 308, 4, 4);
g.FillRectangle(maskBrush, 105, 305, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 308, 4, 4);
g.FillRectangle(maskBrush, 125, 305, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 308, 4, 4);
g.FillRectangle(maskBrush, 145, 305, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 308, 4, 4);
g.FillRectangle(maskBrush, 45, 325, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 328, 4, 4);
g.FillRectangle(maskBrush, 65, 325, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 328, 4, 4);
g.FillRectangle(maskBrush, 85, 325, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 328, 4, 4);
g.FillRectangle(maskBrush, 105, 325, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 328, 4, 4);
g.FillRectangle(maskBrush, 125, 325, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 328, 4, 4);
g.FillRectangle(maskBrush, 145, 325, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 328, 4, 4);
g.FillRectangle(maskBrush, 45, 345, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 348, 4, 4);
g.FillRectangle(maskBrush, 65, 345, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 348, 4, 4);
g.FillRectangle(maskBrush, 85, 345, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 348, 4, 4);
g.FillRectangle(maskBrush, 105, 345, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 348, 4, 4);
g.FillRectangle(maskBrush, 125, 345, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 348, 4, 4);
g.FillRectangle(maskBrush, 145, 345, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 348, 4, 4);
var path = new GraphicsPath([(130, 20),(142, 20),(160, 38),(160, 202),(142, 220),(58, 220),(40, 202),(40, 38),(58, 20),(90, 20),(90, 68),(80, 78),(80, 90),(90, 100),(90, 140),(80, 150),(80, 162),(98, 180),(110, 180),(120, 170),(90, 140),(90, 100),(102, 100),(120, 82),(120, 70),(110, 60),(98, 60),(90, 68),(90, 20)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 128, 18, 4, 4);
g.DrawEllipse(contourPen, 88, 18, 4, 4);
var path = new GraphicsPath([(130, 240),(142, 240),(160, 258),(160, 342),(142, 360),(58, 360),(40, 342),(40, 258),(58, 240),(90, 240),(90, 280),(80, 290),(90, 300),(110, 300),(120, 290),(110, 280),(90, 280),(90, 240)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 128, 238, 4, 4);
g.DrawEllipse(contourPen, 88, 238, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:96432ce8ec3d2d6fcbd72c55c21e01e3ae8641bdf1e7f071e525c8ec64f4ab8d
size 1738

Просмотреть файл

@ -0,0 +1,57 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.FillRectangle(maskBrush, 25, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 28, 4, 4);
g.FillRectangle(maskBrush, 65, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 28, 4, 4);
g.FillRectangle(maskBrush, 105, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 28, 4, 4);
g.FillRectangle(maskBrush, 145, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 28, 4, 4);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 25, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 68, 4, 4);
g.FillRectangle(maskBrush, 65, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 68, 4, 4);
g.FillRectangle(maskBrush, 105, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 68, 4, 4);
g.FillRectangle(maskBrush, 145, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 88, 4, 4);
g.FillRectangle(maskBrush, 85, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 88, 4, 4);
g.FillRectangle(maskBrush, 125, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 88, 4, 4);
g.FillRectangle(maskBrush, 25, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 108, 4, 4);
g.FillRectangle(maskBrush, 65, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 108, 4, 4);
g.FillRectangle(maskBrush, 105, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 108, 4, 4);
g.FillRectangle(maskBrush, 145, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 108, 4, 4);
var path = new GraphicsPath([(40, 20),(40, 40),(60, 40),(60, 20),(70, 20),(70, 40),(60, 40),(60, 60),(40, 60),(40, 80),(60, 80),(60, 100),(80, 100),(80, 80),(100, 80),(100, 100),(120, 100),(120, 80),(140, 80),(140, 60),(120, 60),(120, 40),(100, 40),(100, 60),(80, 60),(80, 40),(70, 40),(70, 20),(80, 20),(80, 40),(100, 40),(100, 20),(120, 20),(120, 40),(140, 40),(140, 20),(160, 20),(160, 40),(140, 40),(140, 60),(160, 60),(160, 80),(140, 80),(140, 100),(160, 100),(160, 120),(140, 120),(140, 100),(120, 100),(120, 120),(100, 120),(100, 100),(80, 100),(80, 120),(60, 120),(60, 100),(40, 100),(40, 120),(20, 120),(20, 100),(40, 100),(40, 80),(20, 80),(20, 60),(40, 60),(40, 40),(20, 40),(20, 20)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 38, 18, 4, 4);
g.DrawEllipse(contourPen, 18, 18, 4, 4);
var path = new GraphicsPath([(60, 60),(80, 60),(80, 80),(60, 80)], [1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 58, 58, 4, 4);
g.DrawEllipse(contourPen, 58, 78, 4, 4);
var path = new GraphicsPath([(100, 60),(120, 60),(120, 80),(100, 80)], [1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 98, 58, 4, 4);
g.DrawEllipse(contourPen, 98, 78, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e60b414028bafafd21da20d54eb4897270c264ae39dac0c3117747edcffb0e9c
size 2447

Просмотреть файл

@ -0,0 +1,57 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.FillRectangle(maskBrush, 25, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 28, 4, 4);
g.FillRectangle(maskBrush, 65, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 28, 4, 4);
g.FillRectangle(maskBrush, 105, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 28, 4, 4);
g.FillRectangle(maskBrush, 145, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 28, 4, 4);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 25, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 68, 4, 4);
g.FillRectangle(maskBrush, 65, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 68, 4, 4);
g.FillRectangle(maskBrush, 105, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 68, 4, 4);
g.FillRectangle(maskBrush, 145, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 88, 4, 4);
g.FillRectangle(maskBrush, 85, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 88, 4, 4);
g.FillRectangle(maskBrush, 125, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 88, 4, 4);
g.FillRectangle(maskBrush, 25, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 108, 4, 4);
g.FillRectangle(maskBrush, 65, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 108, 4, 4);
g.FillRectangle(maskBrush, 105, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 108, 4, 4);
g.FillRectangle(maskBrush, 145, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 108, 4, 4);
var path = new GraphicsPath([(30, 20),(50, 40),(70, 20),(70, 40),(40, 70),(70, 100),(90, 80),(110, 100),(140, 70),(110, 40),(90, 60),(70, 40),(70, 20),(90, 40),(110, 20),(130, 40),(150, 20),(160, 30),(140, 50),(160, 70),(140, 90),(160, 110),(150, 120),(130, 100),(110, 120),(90, 100),(70, 120),(50, 100),(30, 120),(20, 110),(40, 90),(20, 70),(40, 50),(20, 30)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 28, 18, 4, 4);
g.DrawEllipse(contourPen, 18, 28, 4, 4);
var path = new GraphicsPath([(60, 70),(70, 60),(80, 70),(70, 80)], [1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 58, 68, 4, 4);
g.DrawEllipse(contourPen, 68, 78, 4, 4);
var path = new GraphicsPath([(100, 70),(110, 60),(120, 70),(110, 80)], [1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 98, 68, 4, 4);
g.DrawEllipse(contourPen, 108, 78, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:796d2d49d6b0da6a4dd1074300a3df6266e280e36443be36f644db30c7c4ec13
size 2434

Просмотреть файл

@ -0,0 +1,87 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 230, 28, 230, 32);
g.DrawString(10, tickFont, tickBrush, 230, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.FillRectangle(maskBrush, 25, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 28, 4, 4);
g.FillRectangle(maskBrush, 45, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 28, 4, 4);
g.FillRectangle(maskBrush, 105, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 28, 4, 4);
g.FillRectangle(maskBrush, 125, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 28, 4, 4);
g.FillRectangle(maskBrush, 185, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 28, 4, 4);
g.FillRectangle(maskBrush, 205, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 28, 4, 4);
g.FillRectangle(maskBrush, 25, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 105, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 185, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 48, 4, 4);
g.FillRectangle(maskBrush, 205, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 68, 4, 4);
g.FillRectangle(maskBrush, 85, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 68, 4, 4);
g.FillRectangle(maskBrush, 145, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 68, 4, 4);
g.FillRectangle(maskBrush, 165, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 68, 4, 4);
g.FillRectangle(maskBrush, 225, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 68, 4, 4);
g.FillRectangle(maskBrush, 245, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 68, 4, 4);
g.FillRectangle(maskBrush, 65, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 88, 4, 4);
g.FillRectangle(maskBrush, 85, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 88, 4, 4);
g.FillRectangle(maskBrush, 145, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 88, 4, 4);
g.FillRectangle(maskBrush, 165, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 88, 4, 4);
g.FillRectangle(maskBrush, 225, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 88, 4, 4);
g.FillRectangle(maskBrush, 245, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 88, 4, 4);
g.FillRectangle(maskBrush, 25, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 108, 4, 4);
g.FillRectangle(maskBrush, 45, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 108, 4, 4);
g.FillRectangle(maskBrush, 105, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 108, 4, 4);
g.FillRectangle(maskBrush, 125, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 108, 4, 4);
g.FillRectangle(maskBrush, 185, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 108, 4, 4);
g.FillRectangle(maskBrush, 205, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 108, 4, 4);
g.FillRectangle(maskBrush, 25, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 128, 4, 4);
g.FillRectangle(maskBrush, 45, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 128, 4, 4);
g.FillRectangle(maskBrush, 105, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 128, 4, 4);
g.FillRectangle(maskBrush, 125, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 128, 4, 4);
g.FillRectangle(maskBrush, 185, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 128, 4, 4);
g.FillRectangle(maskBrush, 205, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 128, 4, 4);
var path = new GraphicsPath([(40, 20),(60, 20),(60, 60),(100, 60),(100, 20),(110, 20),(110, 60),(100, 60),(100, 100),(140, 100),(140, 60),(110, 60),(110, 20),(140, 20),(140, 60),(180, 60),(180, 20),(190, 20),(190, 60),(180, 60),(180, 100),(220, 100),(220, 60),(190, 60),(190, 20),(220, 20),(220, 60),(260, 60),(260, 100),(220, 100),(220, 140),(180, 140),(180, 100),(140, 100),(140, 140),(100, 140),(100, 100),(60, 100),(60, 140),(20, 140),(20, 100),(60, 100),(60, 60),(20, 60),(20, 20)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 38, 18, 4, 4);
g.DrawEllipse(contourPen, 18, 18, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f77ce8e46085c4e93b4569db3a38d084c7b7fb73abd7761e879ed7077035e359
size 3442

Просмотреть файл

@ -0,0 +1,87 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 230, 28, 230, 32);
g.DrawString(10, tickFont, tickBrush, 230, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.FillRectangle(maskBrush, 25, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 28, 4, 4);
g.FillRectangle(maskBrush, 45, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 28, 4, 4);
g.FillRectangle(maskBrush, 105, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 28, 4, 4);
g.FillRectangle(maskBrush, 125, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 28, 4, 4);
g.FillRectangle(maskBrush, 185, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 28, 4, 4);
g.FillRectangle(maskBrush, 205, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 28, 4, 4);
g.FillRectangle(maskBrush, 25, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 105, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 185, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 48, 4, 4);
g.FillRectangle(maskBrush, 205, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 68, 4, 4);
g.FillRectangle(maskBrush, 85, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 68, 4, 4);
g.FillRectangle(maskBrush, 145, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 68, 4, 4);
g.FillRectangle(maskBrush, 165, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 68, 4, 4);
g.FillRectangle(maskBrush, 225, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 68, 4, 4);
g.FillRectangle(maskBrush, 245, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 68, 4, 4);
g.FillRectangle(maskBrush, 65, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 88, 4, 4);
g.FillRectangle(maskBrush, 85, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 88, 4, 4);
g.FillRectangle(maskBrush, 145, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 88, 4, 4);
g.FillRectangle(maskBrush, 165, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 88, 4, 4);
g.FillRectangle(maskBrush, 225, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 88, 4, 4);
g.FillRectangle(maskBrush, 245, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 88, 4, 4);
g.FillRectangle(maskBrush, 25, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 108, 4, 4);
g.FillRectangle(maskBrush, 45, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 108, 4, 4);
g.FillRectangle(maskBrush, 105, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 108, 4, 4);
g.FillRectangle(maskBrush, 125, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 108, 4, 4);
g.FillRectangle(maskBrush, 185, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 108, 4, 4);
g.FillRectangle(maskBrush, 205, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 108, 4, 4);
g.FillRectangle(maskBrush, 25, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 128, 4, 4);
g.FillRectangle(maskBrush, 45, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 128, 4, 4);
g.FillRectangle(maskBrush, 105, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 128, 4, 4);
g.FillRectangle(maskBrush, 125, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 128, 4, 4);
g.FillRectangle(maskBrush, 185, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 128, 4, 4);
g.FillRectangle(maskBrush, 205, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 128, 4, 4);
var path = new GraphicsPath([(50, 20),(60, 30),(60, 42),(78, 60),(90, 60),(100, 50),(100, 38),(110, 28),(110, 68),(100, 78),(100, 90),(110, 100),(122, 100),(140, 82),(140, 70),(130, 60),(118, 60),(110, 68),(110, 28),(118, 20),(130, 20),(140, 30),(140, 42),(158, 60),(170, 60),(180, 50),(180, 38),(190, 28),(190, 68),(180, 78),(180, 90),(190, 100),(202, 100),(220, 82),(220, 70),(210, 60),(198, 60),(190, 68),(190, 28),(198, 20),(210, 20),(220, 30),(220, 42),(238, 60),(250, 60),(260, 70),(260, 90),(250, 100),(238, 100),(220, 118),(220, 130),(210, 140),(190, 140),(180, 130),(180, 118),(162, 100),(150, 100),(140, 110),(140, 122),(122, 140),(110, 140),(100, 130),(100, 118),(82, 100),(70, 100),(60, 110),(60, 122),(42, 140),(30, 140),(20, 130),(20, 110),(30, 100),(42, 100),(60, 82),(60, 70),(50, 60),(38, 60),(20, 42),(20, 30),(30, 20)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 48, 18, 4, 4);
g.DrawEllipse(contourPen, 28, 18, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1ed8d0328575069381fc9c474a66eebac5057d6816062fbb3fe37d36f2c2c5d9
size 4515

Просмотреть файл

@ -0,0 +1,171 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 230, 28, 230, 32);
g.DrawString(10, tickFont, tickBrush, 230, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.DrawLine(tickPen, 28, 230, 32, 230);
g.DrawString(10, tickFont, tickBrush, 20, 230, sf);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 105, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 145, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 48, 4, 4);
g.FillRectangle(maskBrush, 165, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 48, 4, 4);
g.FillRectangle(maskBrush, 185, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 48, 4, 4);
g.FillRectangle(maskBrush, 205, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 48, 4, 4);
g.FillRectangle(maskBrush, 225, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 48, 4, 4);
g.FillRectangle(maskBrush, 245, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 245, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 88, 4, 4);
g.FillRectangle(maskBrush, 85, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 88, 4, 4);
g.FillRectangle(maskBrush, 105, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 88, 4, 4);
g.FillRectangle(maskBrush, 125, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 88, 4, 4);
g.FillRectangle(maskBrush, 145, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 88, 4, 4);
g.FillRectangle(maskBrush, 165, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 88, 4, 4);
g.FillRectangle(maskBrush, 185, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 88, 4, 4);
g.FillRectangle(maskBrush, 205, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 88, 4, 4);
g.FillRectangle(maskBrush, 245, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 88, 4, 4);
g.FillRectangle(maskBrush, 45, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 108, 4, 4);
g.FillRectangle(maskBrush, 85, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 108, 4, 4);
g.FillRectangle(maskBrush, 205, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 108, 4, 4);
g.FillRectangle(maskBrush, 245, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 108, 4, 4);
g.FillRectangle(maskBrush, 45, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 128, 4, 4);
g.FillRectangle(maskBrush, 85, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 128, 4, 4);
g.FillRectangle(maskBrush, 125, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 128, 4, 4);
g.FillRectangle(maskBrush, 145, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 128, 4, 4);
g.FillRectangle(maskBrush, 165, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 128, 4, 4);
g.FillRectangle(maskBrush, 205, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 128, 4, 4);
g.FillRectangle(maskBrush, 245, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 128, 4, 4);
g.FillRectangle(maskBrush, 45, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 148, 4, 4);
g.FillRectangle(maskBrush, 85, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 148, 4, 4);
g.FillRectangle(maskBrush, 125, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 148, 4, 4);
g.FillRectangle(maskBrush, 165, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 148, 4, 4);
g.FillRectangle(maskBrush, 205, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 148, 4, 4);
g.FillRectangle(maskBrush, 245, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 148, 4, 4);
g.FillRectangle(maskBrush, 45, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 168, 4, 4);
g.FillRectangle(maskBrush, 85, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 168, 4, 4);
g.FillRectangle(maskBrush, 125, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 168, 4, 4);
g.FillRectangle(maskBrush, 145, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 168, 4, 4);
g.FillRectangle(maskBrush, 165, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 168, 4, 4);
g.FillRectangle(maskBrush, 205, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 168, 4, 4);
g.FillRectangle(maskBrush, 245, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 168, 4, 4);
g.FillRectangle(maskBrush, 45, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 188, 4, 4);
g.FillRectangle(maskBrush, 85, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 188, 4, 4);
g.FillRectangle(maskBrush, 205, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 188, 4, 4);
g.FillRectangle(maskBrush, 245, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 188, 4, 4);
g.FillRectangle(maskBrush, 45, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 208, 4, 4);
g.FillRectangle(maskBrush, 85, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 208, 4, 4);
g.FillRectangle(maskBrush, 105, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 208, 4, 4);
g.FillRectangle(maskBrush, 125, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 208, 4, 4);
g.FillRectangle(maskBrush, 145, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 208, 4, 4);
g.FillRectangle(maskBrush, 165, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 208, 4, 4);
g.FillRectangle(maskBrush, 185, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 208, 4, 4);
g.FillRectangle(maskBrush, 205, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 208, 4, 4);
g.FillRectangle(maskBrush, 245, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 208, 4, 4);
g.FillRectangle(maskBrush, 45, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 228, 4, 4);
g.FillRectangle(maskBrush, 245, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 228, 4, 4);
g.FillRectangle(maskBrush, 45, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 248, 4, 4);
g.FillRectangle(maskBrush, 65, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 248, 4, 4);
g.FillRectangle(maskBrush, 85, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 248, 4, 4);
g.FillRectangle(maskBrush, 105, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 248, 4, 4);
g.FillRectangle(maskBrush, 125, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 248, 4, 4);
g.FillRectangle(maskBrush, 145, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 248, 4, 4);
g.FillRectangle(maskBrush, 165, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 248, 4, 4);
g.FillRectangle(maskBrush, 185, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 248, 4, 4);
g.FillRectangle(maskBrush, 205, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 248, 4, 4);
g.FillRectangle(maskBrush, 225, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 248, 4, 4);
g.FillRectangle(maskBrush, 245, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 248, 4, 4);
var path = new GraphicsPath([(60, 40),(70, 40),(70, 60),(60, 60),(60, 240),(240, 240),(240, 60),(70, 60),(70, 40),(260, 40),(260, 260),(40, 260),(40, 40)], [1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 58, 38, 4, 4);
g.DrawEllipse(contourPen, 38, 38, 4, 4);
var path = new GraphicsPath([(100, 80),(110, 80),(110, 100),(100, 100),(100, 200),(200, 200),(200, 100),(110, 100),(110, 80),(220, 80),(220, 220),(80, 220),(80, 80)], [1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 98, 78, 4, 4);
g.DrawEllipse(contourPen, 78, 78, 4, 4);
var path = new GraphicsPath([(140, 120),(150, 120),(150, 140),(140, 140),(140, 160),(160, 160),(160, 140),(150, 140),(150, 120),(180, 120),(180, 180),(120, 180),(120, 120)], [1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 138, 118, 4, 4);
g.DrawEllipse(contourPen, 118, 118, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:74cbe9aa1778c91e9641832c9d616cdc3c137473e7d50eecb77219fa15df18e9
size 5961

Просмотреть файл

@ -0,0 +1,171 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 230, 28, 230, 32);
g.DrawString(10, tickFont, tickBrush, 230, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.DrawLine(tickPen, 28, 230, 32, 230);
g.DrawString(10, tickFont, tickBrush, 20, 230, sf);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 105, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 145, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 48, 4, 4);
g.FillRectangle(maskBrush, 165, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 48, 4, 4);
g.FillRectangle(maskBrush, 185, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 48, 4, 4);
g.FillRectangle(maskBrush, 205, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 48, 4, 4);
g.FillRectangle(maskBrush, 225, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 48, 4, 4);
g.FillRectangle(maskBrush, 245, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 245, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 88, 4, 4);
g.FillRectangle(maskBrush, 85, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 88, 4, 4);
g.FillRectangle(maskBrush, 105, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 88, 4, 4);
g.FillRectangle(maskBrush, 125, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 88, 4, 4);
g.FillRectangle(maskBrush, 145, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 88, 4, 4);
g.FillRectangle(maskBrush, 165, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 88, 4, 4);
g.FillRectangle(maskBrush, 185, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 88, 4, 4);
g.FillRectangle(maskBrush, 205, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 88, 4, 4);
g.FillRectangle(maskBrush, 245, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 88, 4, 4);
g.FillRectangle(maskBrush, 45, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 108, 4, 4);
g.FillRectangle(maskBrush, 85, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 108, 4, 4);
g.FillRectangle(maskBrush, 205, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 108, 4, 4);
g.FillRectangle(maskBrush, 245, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 108, 4, 4);
g.FillRectangle(maskBrush, 45, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 128, 4, 4);
g.FillRectangle(maskBrush, 85, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 128, 4, 4);
g.FillRectangle(maskBrush, 125, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 128, 4, 4);
g.FillRectangle(maskBrush, 145, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 128, 4, 4);
g.FillRectangle(maskBrush, 165, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 128, 4, 4);
g.FillRectangle(maskBrush, 205, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 128, 4, 4);
g.FillRectangle(maskBrush, 245, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 128, 4, 4);
g.FillRectangle(maskBrush, 45, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 148, 4, 4);
g.FillRectangle(maskBrush, 85, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 148, 4, 4);
g.FillRectangle(maskBrush, 125, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 148, 4, 4);
g.FillRectangle(maskBrush, 165, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 148, 4, 4);
g.FillRectangle(maskBrush, 205, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 148, 4, 4);
g.FillRectangle(maskBrush, 245, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 148, 4, 4);
g.FillRectangle(maskBrush, 45, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 168, 4, 4);
g.FillRectangle(maskBrush, 85, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 168, 4, 4);
g.FillRectangle(maskBrush, 125, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 168, 4, 4);
g.FillRectangle(maskBrush, 145, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 168, 4, 4);
g.FillRectangle(maskBrush, 165, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 168, 4, 4);
g.FillRectangle(maskBrush, 205, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 168, 4, 4);
g.FillRectangle(maskBrush, 245, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 168, 4, 4);
g.FillRectangle(maskBrush, 45, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 188, 4, 4);
g.FillRectangle(maskBrush, 85, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 188, 4, 4);
g.FillRectangle(maskBrush, 205, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 188, 4, 4);
g.FillRectangle(maskBrush, 245, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 188, 4, 4);
g.FillRectangle(maskBrush, 45, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 208, 4, 4);
g.FillRectangle(maskBrush, 85, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 208, 4, 4);
g.FillRectangle(maskBrush, 105, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 208, 4, 4);
g.FillRectangle(maskBrush, 125, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 208, 4, 4);
g.FillRectangle(maskBrush, 145, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 208, 4, 4);
g.FillRectangle(maskBrush, 165, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 208, 4, 4);
g.FillRectangle(maskBrush, 185, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 208, 4, 4);
g.FillRectangle(maskBrush, 205, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 208, 4, 4);
g.FillRectangle(maskBrush, 245, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 208, 4, 4);
g.FillRectangle(maskBrush, 45, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 228, 4, 4);
g.FillRectangle(maskBrush, 245, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 228, 4, 4);
g.FillRectangle(maskBrush, 45, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 248, 4, 4);
g.FillRectangle(maskBrush, 65, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 248, 4, 4);
g.FillRectangle(maskBrush, 85, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 248, 4, 4);
g.FillRectangle(maskBrush, 105, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 248, 4, 4);
g.FillRectangle(maskBrush, 125, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 248, 4, 4);
g.FillRectangle(maskBrush, 145, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 248, 4, 4);
g.FillRectangle(maskBrush, 165, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 248, 4, 4);
g.FillRectangle(maskBrush, 185, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 248, 4, 4);
g.FillRectangle(maskBrush, 205, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 248, 4, 4);
g.FillRectangle(maskBrush, 225, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 248, 4, 4);
g.FillRectangle(maskBrush, 245, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 248, 4, 4);
var path = new GraphicsPath([(230, 40),(242, 40),(260, 58),(260, 242),(242, 260),(58, 260),(40, 242),(40, 58),(58, 40),(70, 40),(70, 68),(60, 78),(60, 222),(78, 240),(222, 240),(240, 222),(240, 78),(222, 60),(78, 60),(70, 68),(70, 40)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 228, 38, 4, 4);
g.DrawEllipse(contourPen, 68, 38, 4, 4);
var path = new GraphicsPath([(190, 80),(202, 80),(220, 98),(220, 202),(202, 220),(98, 220),(80, 202),(80, 98),(98, 80),(110, 80),(110, 108),(100, 118),(100, 182),(118, 200),(182, 200),(200, 182),(200, 118),(182, 100),(118, 100),(110, 108),(110, 80)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 188, 78, 4, 4);
g.DrawEllipse(contourPen, 108, 78, 4, 4);
var path = new GraphicsPath([(150, 120),(150, 140),(140, 150),(150, 160),(160, 150),(150, 140),(150, 120),(162, 120),(180, 138),(180, 162),(162, 180),(138, 180),(120, 162),(120, 138),(138, 120)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 148, 118, 4, 4);
g.DrawEllipse(contourPen, 136, 118, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f2af0eb86b7613ed099f9b5f85a1236710c3109eba2ab346756864a8221046c6
size 4568

Просмотреть файл

@ -0,0 +1,214 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 230, 28, 230, 32);
g.DrawString(10, tickFont, tickBrush, 230, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.DrawLine(tickPen, 28, 230, 32, 230);
g.DrawString(10, tickFont, tickBrush, 20, 230, sf);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 105, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 145, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 48, 4, 4);
g.FillRectangle(maskBrush, 165, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 48, 4, 4);
g.FillRectangle(maskBrush, 185, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 48, 4, 4);
g.FillRectangle(maskBrush, 205, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 48, 4, 4);
g.FillRectangle(maskBrush, 225, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 48, 4, 4);
g.FillRectangle(maskBrush, 245, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 65, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 68, 4, 4);
g.FillRectangle(maskBrush, 85, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 68, 4, 4);
g.FillRectangle(maskBrush, 105, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 68, 4, 4);
g.FillRectangle(maskBrush, 125, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 68, 4, 4);
g.FillRectangle(maskBrush, 145, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 68, 4, 4);
g.FillRectangle(maskBrush, 165, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 68, 4, 4);
g.FillRectangle(maskBrush, 185, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 68, 4, 4);
g.FillRectangle(maskBrush, 205, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 68, 4, 4);
g.FillRectangle(maskBrush, 225, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 68, 4, 4);
g.FillRectangle(maskBrush, 245, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 88, 4, 4);
g.FillRectangle(maskBrush, 65, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 88, 4, 4);
g.FillRectangle(maskBrush, 225, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 88, 4, 4);
g.FillRectangle(maskBrush, 245, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 88, 4, 4);
g.FillRectangle(maskBrush, 45, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 108, 4, 4);
g.FillRectangle(maskBrush, 65, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 108, 4, 4);
g.FillRectangle(maskBrush, 105, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 108, 4, 4);
g.FillRectangle(maskBrush, 125, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 108, 4, 4);
g.FillRectangle(maskBrush, 145, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 108, 4, 4);
g.FillRectangle(maskBrush, 165, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 108, 4, 4);
g.FillRectangle(maskBrush, 185, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 108, 4, 4);
g.FillRectangle(maskBrush, 225, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 108, 4, 4);
g.FillRectangle(maskBrush, 245, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 108, 4, 4);
g.FillRectangle(maskBrush, 45, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 128, 4, 4);
g.FillRectangle(maskBrush, 65, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 128, 4, 4);
g.FillRectangle(maskBrush, 105, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 128, 4, 4);
g.FillRectangle(maskBrush, 125, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 128, 4, 4);
g.FillRectangle(maskBrush, 145, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 128, 4, 4);
g.FillRectangle(maskBrush, 165, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 128, 4, 4);
g.FillRectangle(maskBrush, 185, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 128, 4, 4);
g.FillRectangle(maskBrush, 225, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 128, 4, 4);
g.FillRectangle(maskBrush, 245, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 128, 4, 4);
g.FillRectangle(maskBrush, 45, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 148, 4, 4);
g.FillRectangle(maskBrush, 65, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 148, 4, 4);
g.FillRectangle(maskBrush, 105, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 148, 4, 4);
g.FillRectangle(maskBrush, 125, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 148, 4, 4);
g.FillRectangle(maskBrush, 165, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 148, 4, 4);
g.FillRectangle(maskBrush, 185, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 148, 4, 4);
g.FillRectangle(maskBrush, 225, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 148, 4, 4);
g.FillRectangle(maskBrush, 245, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 148, 4, 4);
g.FillRectangle(maskBrush, 45, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 168, 4, 4);
g.FillRectangle(maskBrush, 65, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 168, 4, 4);
g.FillRectangle(maskBrush, 105, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 168, 4, 4);
g.FillRectangle(maskBrush, 125, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 168, 4, 4);
g.FillRectangle(maskBrush, 145, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 168, 4, 4);
g.FillRectangle(maskBrush, 165, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 168, 4, 4);
g.FillRectangle(maskBrush, 185, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 168, 4, 4);
g.FillRectangle(maskBrush, 225, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 168, 4, 4);
g.FillRectangle(maskBrush, 245, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 168, 4, 4);
g.FillRectangle(maskBrush, 45, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 188, 4, 4);
g.FillRectangle(maskBrush, 65, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 188, 4, 4);
g.FillRectangle(maskBrush, 105, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 188, 4, 4);
g.FillRectangle(maskBrush, 125, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 188, 4, 4);
g.FillRectangle(maskBrush, 145, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 188, 4, 4);
g.FillRectangle(maskBrush, 165, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 188, 4, 4);
g.FillRectangle(maskBrush, 185, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 188, 4, 4);
g.FillRectangle(maskBrush, 225, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 188, 4, 4);
g.FillRectangle(maskBrush, 245, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 188, 4, 4);
g.FillRectangle(maskBrush, 45, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 208, 4, 4);
g.FillRectangle(maskBrush, 65, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 208, 4, 4);
g.FillRectangle(maskBrush, 225, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 208, 4, 4);
g.FillRectangle(maskBrush, 245, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 208, 4, 4);
g.FillRectangle(maskBrush, 45, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 228, 4, 4);
g.FillRectangle(maskBrush, 65, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 228, 4, 4);
g.FillRectangle(maskBrush, 85, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 228, 4, 4);
g.FillRectangle(maskBrush, 105, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 228, 4, 4);
g.FillRectangle(maskBrush, 125, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 228, 4, 4);
g.FillRectangle(maskBrush, 145, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 228, 4, 4);
g.FillRectangle(maskBrush, 165, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 228, 4, 4);
g.FillRectangle(maskBrush, 185, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 228, 4, 4);
g.FillRectangle(maskBrush, 205, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 228, 4, 4);
g.FillRectangle(maskBrush, 225, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 228, 4, 4);
g.FillRectangle(maskBrush, 245, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 228, 4, 4);
g.FillRectangle(maskBrush, 45, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 248, 4, 4);
g.FillRectangle(maskBrush, 65, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 248, 4, 4);
g.FillRectangle(maskBrush, 85, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 248, 4, 4);
g.FillRectangle(maskBrush, 105, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 248, 4, 4);
g.FillRectangle(maskBrush, 125, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 248, 4, 4);
g.FillRectangle(maskBrush, 145, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 248, 4, 4);
g.FillRectangle(maskBrush, 165, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 248, 4, 4);
g.FillRectangle(maskBrush, 185, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 248, 4, 4);
g.FillRectangle(maskBrush, 205, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 248, 4, 4);
g.FillRectangle(maskBrush, 225, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 248, 4, 4);
g.FillRectangle(maskBrush, 245, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 248, 4, 4);
var path = new GraphicsPath([(60, 40),(90, 40),(90, 80),(80, 80),(80, 220),(220, 220),(220, 80),(90, 80),(90, 40),(260, 40),(260, 260),(40, 260),(40, 40)], [1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 58, 38, 4, 4);
g.DrawEllipse(contourPen, 38, 38, 4, 4);
var path = new GraphicsPath([(120, 100),(150, 100),(150, 140),(140, 140),(140, 160),(160, 160),(160, 140),(150, 140),(150, 100),(200, 100),(200, 200),(100, 200),(100, 100)], [1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 118, 98, 4, 4);
g.DrawEllipse(contourPen, 98, 98, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9a9436abd945f356fedc43bebe84508f0d75afd0dd6ece2b300767748327a348
size 5609

Просмотреть файл

@ -0,0 +1,214 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 230, 28, 230, 32);
g.DrawString(10, tickFont, tickBrush, 230, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.DrawLine(tickPen, 28, 230, 32, 230);
g.DrawString(10, tickFont, tickBrush, 20, 230, sf);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 105, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 145, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 48, 4, 4);
g.FillRectangle(maskBrush, 165, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 48, 4, 4);
g.FillRectangle(maskBrush, 185, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 48, 4, 4);
g.FillRectangle(maskBrush, 205, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 48, 4, 4);
g.FillRectangle(maskBrush, 225, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 48, 4, 4);
g.FillRectangle(maskBrush, 245, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 65, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 68, 4, 4);
g.FillRectangle(maskBrush, 85, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 68, 4, 4);
g.FillRectangle(maskBrush, 105, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 68, 4, 4);
g.FillRectangle(maskBrush, 125, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 68, 4, 4);
g.FillRectangle(maskBrush, 145, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 68, 4, 4);
g.FillRectangle(maskBrush, 165, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 68, 4, 4);
g.FillRectangle(maskBrush, 185, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 68, 4, 4);
g.FillRectangle(maskBrush, 205, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 68, 4, 4);
g.FillRectangle(maskBrush, 225, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 68, 4, 4);
g.FillRectangle(maskBrush, 245, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 88, 4, 4);
g.FillRectangle(maskBrush, 65, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 88, 4, 4);
g.FillRectangle(maskBrush, 225, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 88, 4, 4);
g.FillRectangle(maskBrush, 245, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 88, 4, 4);
g.FillRectangle(maskBrush, 45, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 108, 4, 4);
g.FillRectangle(maskBrush, 65, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 108, 4, 4);
g.FillRectangle(maskBrush, 105, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 108, 4, 4);
g.FillRectangle(maskBrush, 125, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 108, 4, 4);
g.FillRectangle(maskBrush, 145, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 108, 4, 4);
g.FillRectangle(maskBrush, 165, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 108, 4, 4);
g.FillRectangle(maskBrush, 185, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 108, 4, 4);
g.FillRectangle(maskBrush, 225, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 108, 4, 4);
g.FillRectangle(maskBrush, 245, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 108, 4, 4);
g.FillRectangle(maskBrush, 45, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 128, 4, 4);
g.FillRectangle(maskBrush, 65, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 128, 4, 4);
g.FillRectangle(maskBrush, 105, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 128, 4, 4);
g.FillRectangle(maskBrush, 125, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 128, 4, 4);
g.FillRectangle(maskBrush, 145, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 128, 4, 4);
g.FillRectangle(maskBrush, 165, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 128, 4, 4);
g.FillRectangle(maskBrush, 185, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 128, 4, 4);
g.FillRectangle(maskBrush, 225, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 128, 4, 4);
g.FillRectangle(maskBrush, 245, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 128, 4, 4);
g.FillRectangle(maskBrush, 45, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 148, 4, 4);
g.FillRectangle(maskBrush, 65, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 148, 4, 4);
g.FillRectangle(maskBrush, 105, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 148, 4, 4);
g.FillRectangle(maskBrush, 125, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 148, 4, 4);
g.FillRectangle(maskBrush, 165, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 148, 4, 4);
g.FillRectangle(maskBrush, 185, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 148, 4, 4);
g.FillRectangle(maskBrush, 225, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 148, 4, 4);
g.FillRectangle(maskBrush, 245, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 148, 4, 4);
g.FillRectangle(maskBrush, 45, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 168, 4, 4);
g.FillRectangle(maskBrush, 65, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 168, 4, 4);
g.FillRectangle(maskBrush, 105, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 168, 4, 4);
g.FillRectangle(maskBrush, 125, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 168, 4, 4);
g.FillRectangle(maskBrush, 145, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 168, 4, 4);
g.FillRectangle(maskBrush, 165, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 168, 4, 4);
g.FillRectangle(maskBrush, 185, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 168, 4, 4);
g.FillRectangle(maskBrush, 225, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 168, 4, 4);
g.FillRectangle(maskBrush, 245, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 168, 4, 4);
g.FillRectangle(maskBrush, 45, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 188, 4, 4);
g.FillRectangle(maskBrush, 65, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 188, 4, 4);
g.FillRectangle(maskBrush, 105, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 188, 4, 4);
g.FillRectangle(maskBrush, 125, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 188, 4, 4);
g.FillRectangle(maskBrush, 145, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 188, 4, 4);
g.FillRectangle(maskBrush, 165, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 188, 4, 4);
g.FillRectangle(maskBrush, 185, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 188, 4, 4);
g.FillRectangle(maskBrush, 225, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 188, 4, 4);
g.FillRectangle(maskBrush, 245, 185, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 188, 4, 4);
g.FillRectangle(maskBrush, 45, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 208, 4, 4);
g.FillRectangle(maskBrush, 65, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 208, 4, 4);
g.FillRectangle(maskBrush, 225, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 208, 4, 4);
g.FillRectangle(maskBrush, 245, 205, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 208, 4, 4);
g.FillRectangle(maskBrush, 45, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 228, 4, 4);
g.FillRectangle(maskBrush, 65, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 228, 4, 4);
g.FillRectangle(maskBrush, 85, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 228, 4, 4);
g.FillRectangle(maskBrush, 105, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 228, 4, 4);
g.FillRectangle(maskBrush, 125, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 228, 4, 4);
g.FillRectangle(maskBrush, 145, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 228, 4, 4);
g.FillRectangle(maskBrush, 165, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 228, 4, 4);
g.FillRectangle(maskBrush, 185, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 228, 4, 4);
g.FillRectangle(maskBrush, 205, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 228, 4, 4);
g.FillRectangle(maskBrush, 225, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 228, 4, 4);
g.FillRectangle(maskBrush, 245, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 228, 4, 4);
g.FillRectangle(maskBrush, 45, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 248, 4, 4);
g.FillRectangle(maskBrush, 65, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 248, 4, 4);
g.FillRectangle(maskBrush, 85, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 248, 4, 4);
g.FillRectangle(maskBrush, 105, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 248, 4, 4);
g.FillRectangle(maskBrush, 125, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 248, 4, 4);
g.FillRectangle(maskBrush, 145, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 248, 4, 4);
g.FillRectangle(maskBrush, 165, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 248, 4, 4);
g.FillRectangle(maskBrush, 185, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 188, 248, 4, 4);
g.FillRectangle(maskBrush, 205, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 208, 248, 4, 4);
g.FillRectangle(maskBrush, 225, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 228, 248, 4, 4);
g.FillRectangle(maskBrush, 245, 245, 10, 10);
g.FillRectangle(renderedMaskBrush, 248, 248, 4, 4);
var path = new GraphicsPath([(230, 40),(242, 40),(260, 58),(260, 242),(242, 260),(58, 260),(40, 242),(40, 58),(58, 40),(90, 40),(90, 88),(80, 98),(80, 202),(98, 220),(202, 220),(220, 202),(220, 98),(202, 80),(98, 80),(90, 88),(90, 40)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 228, 38, 4, 4);
g.DrawEllipse(contourPen, 88, 38, 4, 4);
var path = new GraphicsPath([(170, 100),(182, 100),(200, 118),(200, 182),(182, 200),(118, 200),(100, 182),(100, 118),(118, 100),(150, 100),(150, 140),(140, 150),(150, 160),(160, 150),(150, 140),(150, 100)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 168, 98, 4, 4);
g.DrawEllipse(contourPen, 148, 98, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a3f2b02ee9b3752dcfff7e221bb7ea388950072cd903f06595a78d2304fb6502
size 823

Просмотреть файл

@ -0,0 +1,17 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 85, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 68, 4, 4);
g.FillRectangle(maskBrush, 65, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 88, 4, 4);
var path = new GraphicsPath([(80, 40),(80, 60),(100, 60),(100, 80),(80, 80),(80, 100),(60, 100),(60, 80),(40, 80),(40, 60),(60, 60),(60, 40),(70, 40),(70, 60),(60, 60),(60, 80),(80, 80),(80, 60),(70, 60),(70, 40)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 78, 38, 4, 4);
g.DrawEllipse(contourPen, 68, 38, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d999acc1d0b0739dd353b59824bb98ac762e553ee4d2195cdd81b18f86e598a9
size 1206

Просмотреть файл

@ -0,0 +1,17 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 85, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 68, 4, 4);
g.FillRectangle(maskBrush, 65, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 88, 4, 4);
var path = new GraphicsPath([(70, 40),(70, 60),(60, 70),(70, 80),(80, 70),(70, 60),(70, 40),(100, 70),(70, 100),(40, 70),(50, 60)], [1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 68, 38, 4, 4);
g.DrawEllipse(contourPen, 48, 58, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:217c3553759b38862c2d3400b34a7b897d2ead2e133f46770ccff8e2480ec3e4
size 2132

Просмотреть файл

@ -0,0 +1,66 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 105, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 145, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 145, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 88, 4, 4);
g.FillRectangle(maskBrush, 85, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 88, 4, 4);
g.FillRectangle(maskBrush, 105, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 88, 4, 4);
g.FillRectangle(maskBrush, 145, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 88, 4, 4);
g.FillRectangle(maskBrush, 45, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 108, 4, 4);
g.FillRectangle(maskBrush, 85, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 108, 4, 4);
g.FillRectangle(maskBrush, 105, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 108, 4, 4);
g.FillRectangle(maskBrush, 145, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 108, 4, 4);
g.FillRectangle(maskBrush, 45, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 128, 4, 4);
g.FillRectangle(maskBrush, 145, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 128, 4, 4);
g.FillRectangle(maskBrush, 45, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 148, 4, 4);
g.FillRectangle(maskBrush, 65, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 148, 4, 4);
g.FillRectangle(maskBrush, 85, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 148, 4, 4);
g.FillRectangle(maskBrush, 105, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 148, 4, 4);
g.FillRectangle(maskBrush, 125, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 148, 4, 4);
g.FillRectangle(maskBrush, 145, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 148, 4, 4);
var path = new GraphicsPath([(60, 40),(70, 40),(70, 60),(60, 60),(60, 140),(140, 140),(140, 60),(70, 60),(70, 40),(160, 40),(160, 160),(40, 160),(40, 40)], [1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 58, 38, 4, 4);
g.DrawEllipse(contourPen, 38, 38, 4, 4);
var path = new GraphicsPath([(100, 80),(120, 80),(120, 120),(80, 120),(80, 80)], [1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 98, 78, 4, 4);
g.DrawEllipse(contourPen, 78, 78, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e44194f936eda91401d1c991a6d99886b52a93557d2451daf473bf8c40ad6059
size 2667

Просмотреть файл

@ -0,0 +1,66 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 105, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 145, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 145, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 88, 4, 4);
g.FillRectangle(maskBrush, 85, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 88, 4, 4);
g.FillRectangle(maskBrush, 105, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 88, 4, 4);
g.FillRectangle(maskBrush, 145, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 88, 4, 4);
g.FillRectangle(maskBrush, 45, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 108, 4, 4);
g.FillRectangle(maskBrush, 85, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 108, 4, 4);
g.FillRectangle(maskBrush, 105, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 108, 4, 4);
g.FillRectangle(maskBrush, 145, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 108, 4, 4);
g.FillRectangle(maskBrush, 45, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 128, 4, 4);
g.FillRectangle(maskBrush, 145, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 128, 4, 4);
g.FillRectangle(maskBrush, 45, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 148, 4, 4);
g.FillRectangle(maskBrush, 65, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 148, 4, 4);
g.FillRectangle(maskBrush, 85, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 148, 4, 4);
g.FillRectangle(maskBrush, 105, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 148, 4, 4);
g.FillRectangle(maskBrush, 125, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 148, 4, 4);
g.FillRectangle(maskBrush, 145, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 148, 4, 4);
var path = new GraphicsPath([(130, 40),(142, 40),(160, 58),(160, 142),(142, 160),(58, 160),(40, 142),(40, 58),(58, 40),(70, 40),(70, 68),(60, 78),(60, 122),(78, 140),(122, 140),(140, 122),(140, 78),(122, 60),(78, 60),(70, 68),(70, 40)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 128, 38, 4, 4);
g.DrawEllipse(contourPen, 68, 38, 4, 4);
var path = new GraphicsPath([(90, 80),(102, 80),(120, 98),(120, 110),(110, 120),(98, 120),(80, 102),(80, 90)], [1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 88, 78, 4, 4);
g.DrawEllipse(contourPen, 78, 88, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4eb9cb79497f8ed911c9e474e582ebe565e37b2ba1f80f0726704cacef8c6622
size 1361

Просмотреть файл

@ -0,0 +1,39 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 105, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 105, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 88, 4, 4);
g.FillRectangle(maskBrush, 85, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 88, 4, 4);
g.FillRectangle(maskBrush, 105, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 88, 4, 4);
g.FillRectangle(maskBrush, 45, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 108, 4, 4);
g.FillRectangle(maskBrush, 65, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 108, 4, 4);
g.FillRectangle(maskBrush, 85, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 108, 4, 4);
g.FillRectangle(maskBrush, 105, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 108, 4, 4);
var path = new GraphicsPath([(60, 40),(70, 40),(70, 60),(60, 60),(60, 100),(80, 100),(80, 80),(100, 80),(100, 60),(70, 60),(70, 40),(120, 40),(120, 120),(40, 120),(40, 40)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 58, 38, 4, 4);
g.DrawEllipse(contourPen, 38, 38, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3e6d0e741431b0b23875ef58af80ca702c99cc0521d3158b06d58e622d2e3b99
size 1784

Просмотреть файл

@ -0,0 +1,39 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 105, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 105, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 88, 4, 4);
g.FillRectangle(maskBrush, 85, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 88, 4, 4);
g.FillRectangle(maskBrush, 105, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 88, 4, 4);
g.FillRectangle(maskBrush, 45, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 108, 4, 4);
g.FillRectangle(maskBrush, 65, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 108, 4, 4);
g.FillRectangle(maskBrush, 85, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 108, 4, 4);
g.FillRectangle(maskBrush, 105, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 108, 4, 4);
var path = new GraphicsPath([(90, 40),(102, 40),(120, 58),(120, 102),(102, 120),(58, 120),(40, 102),(40, 58),(58, 40),(70, 40),(70, 68),(60, 78),(60, 90),(70, 100),(100, 70),(90, 60),(78, 60),(70, 68),(70, 40)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 88, 38, 4, 4);
g.DrawEllipse(contourPen, 68, 38, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:fbcc6e4f3595d32d0b28d23fc4cf6b054dd311f5a8508bb39556fb1cd4ff4557
size 580

Просмотреть файл

@ -0,0 +1,11 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
var path = new GraphicsPath([(40, 40),(60, 40),(60, 60),(40, 60)], [1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 38, 38, 4, 4);
g.DrawEllipse(contourPen, 38, 58, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1a0e26b2ceafb6c2beac4834c34dd17a8ba58d3457c50b0574faf8ffc215582a
size 613

Просмотреть файл

@ -0,0 +1,11 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
var path = new GraphicsPath([(40, 50),(50, 40),(60, 50),(50, 60)], [1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 38, 48, 4, 4);
g.DrawEllipse(contourPen, 48, 58, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:97b404db6892e5e2e8d71af68d19bcf8459edbe2da00dfc465ce0492883a4412
size 2899

Просмотреть файл

@ -0,0 +1,58 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 230, 28, 230, 32);
g.DrawString(10, tickFont, tickBrush, 230, 20, sf);
g.DrawLine(tickPen, 330, 28, 330, 32);
g.DrawString(15, tickFont, tickBrush, 330, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.DrawLine(tickPen, 28, 230, 32, 230);
g.DrawString(10, tickFont, tickBrush, 20, 230, sf);
g.DrawLine(tickPen, 28, 330, 32, 330);
g.DrawString(15, tickFont, tickBrush, 20, 330, sf);
g.FillRectangle(maskBrush, 325, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 328, 128, 4, 4);
g.FillRectangle(maskBrush, 305, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 308, 168, 4, 4);
g.FillRectangle(maskBrush, 285, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 288, 228, 4, 4);
g.FillRectangle(maskBrush, 45, 265, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 268, 4, 4);
g.FillRectangle(maskBrush, 305, 285, 10, 10);
g.FillRectangle(renderedMaskBrush, 308, 288, 4, 4);
g.FillRectangle(maskBrush, 45, 305, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 308, 4, 4);
var path = new GraphicsPath([(320, 120),(340, 120),(340, 140),(320, 140)], [1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 318, 118, 4, 4);
g.DrawEllipse(contourPen, 318, 138, 4, 4);
var path = new GraphicsPath([(300, 160),(320, 160),(320, 180),(300, 180)], [1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 298, 158, 4, 4);
g.DrawEllipse(contourPen, 298, 178, 4, 4);
var path = new GraphicsPath([(280, 220),(300, 220),(300, 240),(280, 240)], [1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 278, 218, 4, 4);
g.DrawEllipse(contourPen, 278, 238, 4, 4);
var path = new GraphicsPath([(40, 260),(60, 260),(60, 280),(40, 280)], [1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 38, 258, 4, 4);
g.DrawEllipse(contourPen, 38, 278, 4, 4);
var path = new GraphicsPath([(300, 280),(320, 280),(320, 300),(300, 300)], [1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 298, 278, 4, 4);
g.DrawEllipse(contourPen, 298, 298, 4, 4);
var path = new GraphicsPath([(40, 300),(60, 300),(60, 320),(40, 320)], [1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 38, 298, 4, 4);
g.DrawEllipse(contourPen, 38, 318, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d4e7d320d01dd1542237ed65e89722aa785aa79dfb1383240384f4dfa8a1354f
size 3026

Просмотреть файл

@ -0,0 +1,58 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 230, 28, 230, 32);
g.DrawString(10, tickFont, tickBrush, 230, 20, sf);
g.DrawLine(tickPen, 330, 28, 330, 32);
g.DrawString(15, tickFont, tickBrush, 330, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.DrawLine(tickPen, 28, 230, 32, 230);
g.DrawString(10, tickFont, tickBrush, 20, 230, sf);
g.DrawLine(tickPen, 28, 330, 32, 330);
g.DrawString(15, tickFont, tickBrush, 20, 330, sf);
g.FillRectangle(maskBrush, 325, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 328, 128, 4, 4);
g.FillRectangle(maskBrush, 305, 165, 10, 10);
g.FillRectangle(renderedMaskBrush, 308, 168, 4, 4);
g.FillRectangle(maskBrush, 285, 225, 10, 10);
g.FillRectangle(renderedMaskBrush, 288, 228, 4, 4);
g.FillRectangle(maskBrush, 45, 265, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 268, 4, 4);
g.FillRectangle(maskBrush, 305, 285, 10, 10);
g.FillRectangle(renderedMaskBrush, 308, 288, 4, 4);
g.FillRectangle(maskBrush, 45, 305, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 308, 4, 4);
var path = new GraphicsPath([(320, 130),(330, 120),(340, 130),(330, 140)], [1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 318, 128, 4, 4);
g.DrawEllipse(contourPen, 328, 138, 4, 4);
var path = new GraphicsPath([(300, 170),(310, 160),(320, 170),(310, 180)], [1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 298, 168, 4, 4);
g.DrawEllipse(contourPen, 308, 178, 4, 4);
var path = new GraphicsPath([(280, 230),(290, 220),(300, 230),(290, 240)], [1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 278, 228, 4, 4);
g.DrawEllipse(contourPen, 288, 238, 4, 4);
var path = new GraphicsPath([(40, 270),(50, 260),(60, 270),(50, 280)], [1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 38, 268, 4, 4);
g.DrawEllipse(contourPen, 48, 278, 4, 4);
var path = new GraphicsPath([(300, 290),(310, 280),(320, 290),(310, 300)], [1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 298, 288, 4, 4);
g.DrawEllipse(contourPen, 308, 298, 4, 4);
var path = new GraphicsPath([(40, 310),(50, 300),(60, 310),(50, 320)], [1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 38, 308, 4, 4);
g.DrawEllipse(contourPen, 48, 318, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:fad8c4700140b12244d33d4d667ca0f9b234a307c9114b2346da6b0ac316cf18
size 687

Просмотреть файл

@ -0,0 +1,15 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
var path = new GraphicsPath([(60, 40),(100, 40),(100, 60),(40, 60),(40, 40)], [1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 58, 38, 4, 4);
g.DrawEllipse(contourPen, 38, 38, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e4eb3fbfaa5918c6ffc537c6a3013fe518dc8f29a4f6bea3e6faed6f4e77ad80
size 761

Просмотреть файл

@ -0,0 +1,15 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
var path = new GraphicsPath([(90, 40),(100, 50),(90, 60),(50, 60),(40, 50),(50, 40)], [1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 88, 38, 4, 4);
g.DrawEllipse(contourPen, 48, 38, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bfb49dfbcc573ebaaaa728d7bba4adb61ff5a4ff3f58a386d6b0135c0b35a12f
size 1362092

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:739c6a3177a01b488c430e4d735bab3d6e64320b8263714c731ff21ebc43ad05
size 1419395

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:60b8146d0745900e7f9e096b5f5c5266048dfa57448398ba749fcb006215eebb
size 969

Просмотреть файл

@ -0,0 +1,25 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 85, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 88, 4, 4);
g.FillRectangle(maskBrush, 65, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 88, 4, 4);
g.FillRectangle(maskBrush, 85, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 88, 4, 4);
var path = new GraphicsPath([(60, 40),(70, 40),(70, 60),(60, 60),(60, 80),(80, 80),(80, 60),(70, 60),(70, 40),(100, 40),(100, 100),(40, 100),(40, 40)], [1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 58, 38, 4, 4);
g.DrawEllipse(contourPen, 38, 38, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b96f60fd4f5c0b57e7727a7f2cf36f4f6400d26f53d3d5172683c6585f70faae
size 1299

Просмотреть файл

@ -0,0 +1,25 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 85, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 88, 4, 4);
g.FillRectangle(maskBrush, 65, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 88, 4, 4);
g.FillRectangle(maskBrush, 85, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 88, 4, 4);
var path = new GraphicsPath([(70, 40),(70, 60),(60, 70),(70, 80),(80, 70),(70, 60),(70, 40),(82, 40),(100, 58),(100, 82),(82, 100),(58, 100),(40, 82),(40, 58),(58, 40)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 68, 38, 4, 4);
g.DrawEllipse(contourPen, 56, 38, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3a147e9b61849fb0e9a2a3be69428d6dd3c256373cf46187a7c07f1ab9b9cdaa
size 1810

Просмотреть файл

@ -0,0 +1,77 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 105, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 145, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 65, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 68, 4, 4);
g.FillRectangle(maskBrush, 85, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 68, 4, 4);
g.FillRectangle(maskBrush, 105, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 68, 4, 4);
g.FillRectangle(maskBrush, 125, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 68, 4, 4);
g.FillRectangle(maskBrush, 145, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 88, 4, 4);
g.FillRectangle(maskBrush, 65, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 88, 4, 4);
g.FillRectangle(maskBrush, 125, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 88, 4, 4);
g.FillRectangle(maskBrush, 145, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 88, 4, 4);
g.FillRectangle(maskBrush, 45, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 108, 4, 4);
g.FillRectangle(maskBrush, 65, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 108, 4, 4);
g.FillRectangle(maskBrush, 125, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 108, 4, 4);
g.FillRectangle(maskBrush, 145, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 108, 4, 4);
g.FillRectangle(maskBrush, 45, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 128, 4, 4);
g.FillRectangle(maskBrush, 65, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 128, 4, 4);
g.FillRectangle(maskBrush, 85, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 128, 4, 4);
g.FillRectangle(maskBrush, 105, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 128, 4, 4);
g.FillRectangle(maskBrush, 125, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 128, 4, 4);
g.FillRectangle(maskBrush, 145, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 128, 4, 4);
g.FillRectangle(maskBrush, 45, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 148, 4, 4);
g.FillRectangle(maskBrush, 65, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 148, 4, 4);
g.FillRectangle(maskBrush, 85, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 148, 4, 4);
g.FillRectangle(maskBrush, 105, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 148, 4, 4);
g.FillRectangle(maskBrush, 125, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 148, 4, 4);
g.FillRectangle(maskBrush, 145, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 148, 4, 4);
var path = new GraphicsPath([(60, 40),(90, 40),(90, 80),(80, 80),(80, 120),(120, 120),(120, 80),(90, 80),(90, 40),(160, 40),(160, 160),(40, 160),(40, 40)], [1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 58, 38, 4, 4);
g.DrawEllipse(contourPen, 38, 38, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:15a64b19fbe36facd005d400f32ece0f15d7458e66f4cd98d4eae583e6f6f06f
size 2375

Просмотреть файл

@ -0,0 +1,77 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 105, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 145, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 65, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 68, 4, 4);
g.FillRectangle(maskBrush, 85, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 68, 4, 4);
g.FillRectangle(maskBrush, 105, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 68, 4, 4);
g.FillRectangle(maskBrush, 125, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 68, 4, 4);
g.FillRectangle(maskBrush, 145, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 88, 4, 4);
g.FillRectangle(maskBrush, 65, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 88, 4, 4);
g.FillRectangle(maskBrush, 125, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 88, 4, 4);
g.FillRectangle(maskBrush, 145, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 88, 4, 4);
g.FillRectangle(maskBrush, 45, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 108, 4, 4);
g.FillRectangle(maskBrush, 65, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 108, 4, 4);
g.FillRectangle(maskBrush, 125, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 108, 4, 4);
g.FillRectangle(maskBrush, 145, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 108, 4, 4);
g.FillRectangle(maskBrush, 45, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 128, 4, 4);
g.FillRectangle(maskBrush, 65, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 128, 4, 4);
g.FillRectangle(maskBrush, 85, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 128, 4, 4);
g.FillRectangle(maskBrush, 105, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 128, 4, 4);
g.FillRectangle(maskBrush, 125, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 128, 4, 4);
g.FillRectangle(maskBrush, 145, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 128, 4, 4);
g.FillRectangle(maskBrush, 45, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 148, 4, 4);
g.FillRectangle(maskBrush, 65, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 148, 4, 4);
g.FillRectangle(maskBrush, 85, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 148, 4, 4);
g.FillRectangle(maskBrush, 105, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 148, 4, 4);
g.FillRectangle(maskBrush, 125, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 148, 4, 4);
g.FillRectangle(maskBrush, 145, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 148, 4, 4);
var path = new GraphicsPath([(130, 40),(142, 40),(160, 58),(160, 142),(142, 160),(58, 160),(40, 142),(40, 58),(58, 40),(90, 40),(90, 88),(80, 98),(80, 110),(90, 120),(102, 120),(120, 102),(120, 90),(110, 80),(98, 80),(90, 88),(90, 40)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 128, 38, 4, 4);
g.DrawEllipse(contourPen, 88, 38, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7d7ff9f02e7c661f00f9bfc0c80ab2c941038e257c60c1fb256bd7929ee8ace2
size 1848

Просмотреть файл

@ -0,0 +1,75 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 105, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 145, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 65, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 68, 4, 4);
g.FillRectangle(maskBrush, 105, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 68, 4, 4);
g.FillRectangle(maskBrush, 125, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 68, 4, 4);
g.FillRectangle(maskBrush, 145, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 88, 4, 4);
g.FillRectangle(maskBrush, 65, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 88, 4, 4);
g.FillRectangle(maskBrush, 125, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 88, 4, 4);
g.FillRectangle(maskBrush, 145, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 88, 4, 4);
g.FillRectangle(maskBrush, 45, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 108, 4, 4);
g.FillRectangle(maskBrush, 65, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 108, 4, 4);
g.FillRectangle(maskBrush, 125, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 108, 4, 4);
g.FillRectangle(maskBrush, 145, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 108, 4, 4);
g.FillRectangle(maskBrush, 45, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 128, 4, 4);
g.FillRectangle(maskBrush, 65, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 128, 4, 4);
g.FillRectangle(maskBrush, 85, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 128, 4, 4);
g.FillRectangle(maskBrush, 105, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 128, 4, 4);
g.FillRectangle(maskBrush, 125, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 128, 4, 4);
g.FillRectangle(maskBrush, 145, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 128, 4, 4);
g.FillRectangle(maskBrush, 45, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 148, 4, 4);
g.FillRectangle(maskBrush, 65, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 148, 4, 4);
g.FillRectangle(maskBrush, 85, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 148, 4, 4);
g.FillRectangle(maskBrush, 105, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 148, 4, 4);
g.FillRectangle(maskBrush, 125, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 148, 4, 4);
g.FillRectangle(maskBrush, 145, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 148, 4, 4);
var path = new GraphicsPath([(60, 40),(90, 40),(90, 60),(80, 60),(80, 120),(120, 120),(120, 80),(100, 80),(100, 60),(90, 60),(90, 40),(160, 40),(160, 160),(40, 160),(40, 40)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 58, 38, 4, 4);
g.DrawEllipse(contourPen, 38, 38, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8f775e3d3e409ca12345c7aef1f6ef8ff8c19da3be1e56b3f28d1be0f6c64268
size 2413

Просмотреть файл

@ -0,0 +1,75 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 105, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 145, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 65, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 68, 4, 4);
g.FillRectangle(maskBrush, 105, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 68, 4, 4);
g.FillRectangle(maskBrush, 125, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 68, 4, 4);
g.FillRectangle(maskBrush, 145, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 88, 4, 4);
g.FillRectangle(maskBrush, 65, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 88, 4, 4);
g.FillRectangle(maskBrush, 125, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 88, 4, 4);
g.FillRectangle(maskBrush, 145, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 88, 4, 4);
g.FillRectangle(maskBrush, 45, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 108, 4, 4);
g.FillRectangle(maskBrush, 65, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 108, 4, 4);
g.FillRectangle(maskBrush, 125, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 108, 4, 4);
g.FillRectangle(maskBrush, 145, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 108, 4, 4);
g.FillRectangle(maskBrush, 45, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 128, 4, 4);
g.FillRectangle(maskBrush, 65, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 128, 4, 4);
g.FillRectangle(maskBrush, 85, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 128, 4, 4);
g.FillRectangle(maskBrush, 105, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 128, 4, 4);
g.FillRectangle(maskBrush, 125, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 128, 4, 4);
g.FillRectangle(maskBrush, 145, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 128, 4, 4);
g.FillRectangle(maskBrush, 45, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 148, 4, 4);
g.FillRectangle(maskBrush, 65, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 148, 4, 4);
g.FillRectangle(maskBrush, 85, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 148, 4, 4);
g.FillRectangle(maskBrush, 105, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 148, 4, 4);
g.FillRectangle(maskBrush, 125, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 148, 4, 4);
g.FillRectangle(maskBrush, 145, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 148, 4, 4);
var path = new GraphicsPath([(130, 40),(142, 40),(160, 58),(160, 142),(142, 160),(58, 160),(40, 142),(40, 58),(58, 40),(90, 40),(90, 60),(80, 70),(80, 102),(98, 120),(110, 120),(120, 110),(120, 90),(90, 60),(90, 40)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 128, 38, 4, 4);
g.DrawEllipse(contourPen, 88, 38, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:eebe7ae658bb4118bc0d36b944e9597a7759ed59a48e40325fc676f1289013d5
size 1883

Просмотреть файл

@ -0,0 +1,81 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 145, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 48, 4, 4);
g.FillRectangle(maskBrush, 165, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 65, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 68, 4, 4);
g.FillRectangle(maskBrush, 85, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 68, 4, 4);
g.FillRectangle(maskBrush, 125, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 68, 4, 4);
g.FillRectangle(maskBrush, 145, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 68, 4, 4);
g.FillRectangle(maskBrush, 165, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 88, 4, 4);
g.FillRectangle(maskBrush, 65, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 88, 4, 4);
g.FillRectangle(maskBrush, 145, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 88, 4, 4);
g.FillRectangle(maskBrush, 165, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 88, 4, 4);
g.FillRectangle(maskBrush, 45, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 108, 4, 4);
g.FillRectangle(maskBrush, 65, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 108, 4, 4);
g.FillRectangle(maskBrush, 145, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 108, 4, 4);
g.FillRectangle(maskBrush, 165, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 108, 4, 4);
g.FillRectangle(maskBrush, 45, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 128, 4, 4);
g.FillRectangle(maskBrush, 65, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 128, 4, 4);
g.FillRectangle(maskBrush, 85, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 128, 4, 4);
g.FillRectangle(maskBrush, 105, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 128, 4, 4);
g.FillRectangle(maskBrush, 125, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 128, 4, 4);
g.FillRectangle(maskBrush, 145, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 128, 4, 4);
g.FillRectangle(maskBrush, 165, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 128, 4, 4);
g.FillRectangle(maskBrush, 45, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 148, 4, 4);
g.FillRectangle(maskBrush, 65, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 148, 4, 4);
g.FillRectangle(maskBrush, 85, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 148, 4, 4);
g.FillRectangle(maskBrush, 105, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 148, 4, 4);
g.FillRectangle(maskBrush, 125, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 148, 4, 4);
g.FillRectangle(maskBrush, 145, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 148, 4, 4);
g.FillRectangle(maskBrush, 165, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 148, 4, 4);
var path = new GraphicsPath([(60, 40),(100, 40),(100, 80),(80, 80),(80, 120),(140, 120),(140, 80),(120, 80),(120, 40),(180, 40),(180, 160),(40, 160),(40, 40)], [1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 58, 38, 4, 4);
g.DrawEllipse(contourPen, 38, 38, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:39f7009881446fb26c0c9339b652d7ca057e729e9b1c9d666edb76045399122b
size 2417

Просмотреть файл

@ -0,0 +1,81 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 145, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 48, 4, 4);
g.FillRectangle(maskBrush, 165, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 65, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 68, 4, 4);
g.FillRectangle(maskBrush, 85, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 68, 4, 4);
g.FillRectangle(maskBrush, 125, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 68, 4, 4);
g.FillRectangle(maskBrush, 145, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 68, 4, 4);
g.FillRectangle(maskBrush, 165, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 88, 4, 4);
g.FillRectangle(maskBrush, 65, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 88, 4, 4);
g.FillRectangle(maskBrush, 145, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 88, 4, 4);
g.FillRectangle(maskBrush, 165, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 88, 4, 4);
g.FillRectangle(maskBrush, 45, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 108, 4, 4);
g.FillRectangle(maskBrush, 65, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 108, 4, 4);
g.FillRectangle(maskBrush, 145, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 108, 4, 4);
g.FillRectangle(maskBrush, 165, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 108, 4, 4);
g.FillRectangle(maskBrush, 45, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 128, 4, 4);
g.FillRectangle(maskBrush, 65, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 128, 4, 4);
g.FillRectangle(maskBrush, 85, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 128, 4, 4);
g.FillRectangle(maskBrush, 105, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 128, 4, 4);
g.FillRectangle(maskBrush, 125, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 128, 4, 4);
g.FillRectangle(maskBrush, 145, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 128, 4, 4);
g.FillRectangle(maskBrush, 165, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 128, 4, 4);
g.FillRectangle(maskBrush, 45, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 148, 4, 4);
g.FillRectangle(maskBrush, 65, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 148, 4, 4);
g.FillRectangle(maskBrush, 85, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 148, 4, 4);
g.FillRectangle(maskBrush, 105, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 148, 4, 4);
g.FillRectangle(maskBrush, 125, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 148, 4, 4);
g.FillRectangle(maskBrush, 145, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 148, 4, 4);
g.FillRectangle(maskBrush, 165, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 148, 4, 4);
var path = new GraphicsPath([(70, 40),(82, 40),(100, 58),(100, 70),(80, 90),(80, 102),(98, 120),(122, 120),(140, 102),(140, 90),(120, 70),(120, 58),(138, 40),(162, 40),(180, 58),(180, 142),(162, 160),(58, 160),(40, 142),(40, 58),(58, 40)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 68, 38, 4, 4);
g.DrawEllipse(contourPen, 56, 38, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3e904b8588c43ba3f3cd58d9e452ef99b45e6b498ea06858d42133187be216bd
size 1972

Просмотреть файл

@ -0,0 +1,81 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.FillRectangle(maskBrush, 45, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 28, 4, 4);
g.FillRectangle(maskBrush, 65, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 28, 4, 4);
g.FillRectangle(maskBrush, 85, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 28, 4, 4);
g.FillRectangle(maskBrush, 105, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 28, 4, 4);
g.FillRectangle(maskBrush, 125, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 28, 4, 4);
g.FillRectangle(maskBrush, 145, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 28, 4, 4);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 105, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 145, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 65, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 68, 4, 4);
g.FillRectangle(maskBrush, 125, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 68, 4, 4);
g.FillRectangle(maskBrush, 145, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 68, 4, 4);
g.FillRectangle(maskBrush, 125, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 88, 4, 4);
g.FillRectangle(maskBrush, 145, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 88, 4, 4);
g.FillRectangle(maskBrush, 45, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 108, 4, 4);
g.FillRectangle(maskBrush, 65, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 108, 4, 4);
g.FillRectangle(maskBrush, 125, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 108, 4, 4);
g.FillRectangle(maskBrush, 145, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 108, 4, 4);
g.FillRectangle(maskBrush, 45, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 128, 4, 4);
g.FillRectangle(maskBrush, 65, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 128, 4, 4);
g.FillRectangle(maskBrush, 85, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 128, 4, 4);
g.FillRectangle(maskBrush, 105, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 128, 4, 4);
g.FillRectangle(maskBrush, 125, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 128, 4, 4);
g.FillRectangle(maskBrush, 145, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 128, 4, 4);
g.FillRectangle(maskBrush, 45, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 148, 4, 4);
g.FillRectangle(maskBrush, 65, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 148, 4, 4);
g.FillRectangle(maskBrush, 85, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 148, 4, 4);
g.FillRectangle(maskBrush, 105, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 148, 4, 4);
g.FillRectangle(maskBrush, 125, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 148, 4, 4);
g.FillRectangle(maskBrush, 145, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 148, 4, 4);
var path = new GraphicsPath([(60, 20),(160, 20),(160, 160),(40, 160),(40, 100),(80, 100),(80, 120),(120, 120),(120, 60),(80, 60),(80, 80),(40, 80),(40, 20)], [1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 58, 18, 4, 4);
g.DrawEllipse(contourPen, 38, 18, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cb45dd2b8dec3e03ff357005598066ed83876afbb1dd0a55d6527979fa2636d3
size 2600

Просмотреть файл

@ -0,0 +1,81 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.FillRectangle(maskBrush, 45, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 28, 4, 4);
g.FillRectangle(maskBrush, 65, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 28, 4, 4);
g.FillRectangle(maskBrush, 85, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 28, 4, 4);
g.FillRectangle(maskBrush, 105, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 28, 4, 4);
g.FillRectangle(maskBrush, 125, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 28, 4, 4);
g.FillRectangle(maskBrush, 145, 25, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 28, 4, 4);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 105, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 145, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 65, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 68, 4, 4);
g.FillRectangle(maskBrush, 125, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 68, 4, 4);
g.FillRectangle(maskBrush, 145, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 68, 4, 4);
g.FillRectangle(maskBrush, 125, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 88, 4, 4);
g.FillRectangle(maskBrush, 145, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 88, 4, 4);
g.FillRectangle(maskBrush, 45, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 108, 4, 4);
g.FillRectangle(maskBrush, 65, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 108, 4, 4);
g.FillRectangle(maskBrush, 125, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 108, 4, 4);
g.FillRectangle(maskBrush, 145, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 108, 4, 4);
g.FillRectangle(maskBrush, 45, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 128, 4, 4);
g.FillRectangle(maskBrush, 65, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 128, 4, 4);
g.FillRectangle(maskBrush, 85, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 128, 4, 4);
g.FillRectangle(maskBrush, 105, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 128, 4, 4);
g.FillRectangle(maskBrush, 125, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 128, 4, 4);
g.FillRectangle(maskBrush, 145, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 128, 4, 4);
g.FillRectangle(maskBrush, 45, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 148, 4, 4);
g.FillRectangle(maskBrush, 65, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 148, 4, 4);
g.FillRectangle(maskBrush, 85, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 148, 4, 4);
g.FillRectangle(maskBrush, 105, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 148, 4, 4);
g.FillRectangle(maskBrush, 125, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 148, 4, 4);
g.FillRectangle(maskBrush, 145, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 148, 4, 4);
var path = new GraphicsPath([(130, 20),(142, 20),(160, 38),(160, 142),(142, 160),(58, 160),(40, 142),(40, 118),(58, 100),(70, 100),(90, 120),(102, 120),(120, 102),(120, 78),(102, 60),(90, 60),(70, 80),(58, 80),(40, 62),(40, 38),(58, 20),(70, 20)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 128, 18, 4, 4);
g.DrawEllipse(contourPen, 68, 18, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d5f2254078119917f63985e70e61febf97b57632d71ef3a50864d490424be0b4
size 2157

Просмотреть файл

@ -0,0 +1,85 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.FillRectangle(maskBrush, 25, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 105, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 145, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 48, 4, 4);
g.FillRectangle(maskBrush, 165, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 48, 4, 4);
g.FillRectangle(maskBrush, 25, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 65, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 68, 4, 4);
g.FillRectangle(maskBrush, 105, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 68, 4, 4);
g.FillRectangle(maskBrush, 145, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 68, 4, 4);
g.FillRectangle(maskBrush, 165, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 68, 4, 4);
g.FillRectangle(maskBrush, 25, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 88, 4, 4);
g.FillRectangle(maskBrush, 65, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 88, 4, 4);
g.FillRectangle(maskBrush, 145, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 88, 4, 4);
g.FillRectangle(maskBrush, 165, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 88, 4, 4);
g.FillRectangle(maskBrush, 25, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 108, 4, 4);
g.FillRectangle(maskBrush, 165, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 108, 4, 4);
g.FillRectangle(maskBrush, 25, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 128, 4, 4);
g.FillRectangle(maskBrush, 45, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 128, 4, 4);
g.FillRectangle(maskBrush, 65, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 128, 4, 4);
g.FillRectangle(maskBrush, 85, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 128, 4, 4);
g.FillRectangle(maskBrush, 105, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 128, 4, 4);
g.FillRectangle(maskBrush, 125, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 128, 4, 4);
g.FillRectangle(maskBrush, 145, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 128, 4, 4);
g.FillRectangle(maskBrush, 165, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 128, 4, 4);
g.FillRectangle(maskBrush, 25, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 148, 4, 4);
g.FillRectangle(maskBrush, 45, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 148, 4, 4);
g.FillRectangle(maskBrush, 65, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 148, 4, 4);
g.FillRectangle(maskBrush, 85, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 148, 4, 4);
g.FillRectangle(maskBrush, 105, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 148, 4, 4);
g.FillRectangle(maskBrush, 125, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 148, 4, 4);
g.FillRectangle(maskBrush, 145, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 148, 4, 4);
g.FillRectangle(maskBrush, 165, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 148, 4, 4);
var path = new GraphicsPath([(40, 40),(90, 40),(90, 60),(80, 60),(80, 100),(60, 100),(60, 80),(40, 80),(40, 120),(160, 120),(160, 100),(140, 100),(140, 60),(120, 60),(120, 80),(100, 80),(100, 60),(90, 60),(90, 40),(180, 40),(180, 160),(20, 160),(20, 40)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 38, 38, 4, 4);
g.DrawEllipse(contourPen, 18, 38, 4, 4);

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c865e93a6f1be97711fc43414a3f2acdbfcf720f7ae9d195afbc8929ed435344
size 2915

Просмотреть файл

@ -0,0 +1,85 @@
g.DrawLine(tickPen, 30, 28, 30, 32);
g.DrawString(0, tickFont, tickBrush, 30, 20, sf);
g.DrawLine(tickPen, 130, 28, 130, 32);
g.DrawString(5, tickFont, tickBrush, 130, 20, sf);
g.DrawLine(tickPen, 28, 30, 32, 30);
g.DrawString(0, tickFont, tickBrush, 20, 30, sf);
g.DrawLine(tickPen, 28, 130, 32, 130);
g.DrawString(5, tickFont, tickBrush, 20, 130, sf);
g.FillRectangle(maskBrush, 25, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 48, 4, 4);
g.FillRectangle(maskBrush, 45, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 48, 4, 4);
g.FillRectangle(maskBrush, 65, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 48, 4, 4);
g.FillRectangle(maskBrush, 85, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 48, 4, 4);
g.FillRectangle(maskBrush, 105, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 48, 4, 4);
g.FillRectangle(maskBrush, 125, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 48, 4, 4);
g.FillRectangle(maskBrush, 145, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 48, 4, 4);
g.FillRectangle(maskBrush, 165, 45, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 48, 4, 4);
g.FillRectangle(maskBrush, 25, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 68, 4, 4);
g.FillRectangle(maskBrush, 45, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 68, 4, 4);
g.FillRectangle(maskBrush, 65, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 68, 4, 4);
g.FillRectangle(maskBrush, 105, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 68, 4, 4);
g.FillRectangle(maskBrush, 145, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 68, 4, 4);
g.FillRectangle(maskBrush, 165, 65, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 68, 4, 4);
g.FillRectangle(maskBrush, 25, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 88, 4, 4);
g.FillRectangle(maskBrush, 65, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 88, 4, 4);
g.FillRectangle(maskBrush, 145, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 88, 4, 4);
g.FillRectangle(maskBrush, 165, 85, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 88, 4, 4);
g.FillRectangle(maskBrush, 25, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 108, 4, 4);
g.FillRectangle(maskBrush, 165, 105, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 108, 4, 4);
g.FillRectangle(maskBrush, 25, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 128, 4, 4);
g.FillRectangle(maskBrush, 45, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 128, 4, 4);
g.FillRectangle(maskBrush, 65, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 128, 4, 4);
g.FillRectangle(maskBrush, 85, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 128, 4, 4);
g.FillRectangle(maskBrush, 105, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 128, 4, 4);
g.FillRectangle(maskBrush, 125, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 128, 4, 4);
g.FillRectangle(maskBrush, 145, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 128, 4, 4);
g.FillRectangle(maskBrush, 165, 125, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 128, 4, 4);
g.FillRectangle(maskBrush, 25, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 28, 148, 4, 4);
g.FillRectangle(maskBrush, 45, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 48, 148, 4, 4);
g.FillRectangle(maskBrush, 65, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 68, 148, 4, 4);
g.FillRectangle(maskBrush, 85, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 88, 148, 4, 4);
g.FillRectangle(maskBrush, 105, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 108, 148, 4, 4);
g.FillRectangle(maskBrush, 125, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 128, 148, 4, 4);
g.FillRectangle(maskBrush, 145, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 148, 148, 4, 4);
g.FillRectangle(maskBrush, 165, 145, 10, 10);
g.FillRectangle(renderedMaskBrush, 168, 148, 4, 4);
var path = new GraphicsPath([(150, 40),(162, 40),(180, 58),(180, 142),(162, 160),(38, 160),(20, 142),(20, 58),(38, 40),(90, 40),(90, 60),(70, 100),(50, 80),(40, 90),(40, 102),(58, 120),(150, 120),(160, 110),(150, 100),(130, 60),(110, 80),(90, 60),(90, 40)], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], FillMode.Alternate);
g.FillPath(contourFilling, path);
g.DrawPath(contourPen, path);
g.DrawRectangle(contourPen, 148, 38, 4, 4);
g.DrawEllipse(contourPen, 88, 38, 4, 4);

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -0,0 +1,577 @@
/// ------------------------------------------------------------------------------------------
/// Copyright (c) Microsoft Corporation. All rights reserved.
/// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information.
/// ------------------------------------------------------------------------------------------
namespace Microsoft.RTConvert.Contours.Tests
{
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.RTConvert.Contours;
using Microsoft.RTConvert.Models;
using NUnit.Framework;
[TestFixture]
public class FillPolygonTests
{
/// <summary>
/// Creates a new point from the arguments, using a cast from double to float.
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public PointF CreatePoint(double x, double y) => new PointF((float)x, (float)y);
[Test]
public void TestPointNearLine()
{
Assert.IsFalse(FillPolygon.PointOnLine(CreatePoint(1.5, 1.5), CreatePoint(1.5, 1.5), CreatePoint(2.0, 2.0), 0.01f));
Assert.IsTrue(FillPolygon.PointOnLine(CreatePoint(1.5, 1.5), CreatePoint(1.5, 1.5), CreatePoint(1.5, 1.5), 0.01f));
Assert.IsTrue(FillPolygon.PointOnLine(CreatePoint(1.5, 1.5), CreatePoint(1.5, 1.5), CreatePoint(1.5001, 1.5001), 0.01f));
// On line to float precision
Assert.IsTrue(FillPolygon.PointOnLine(CreatePoint(1, 1), CreatePoint(2, 2), CreatePoint(1.5f, 1.5f), 0.01f));
Assert.IsTrue(FillPolygon.PointOnLine(CreatePoint(2, 2), CreatePoint(1, 1), CreatePoint(1.5f, 1.5f), 0.01f));
// Near line within tolerance
Assert.IsTrue(FillPolygon.PointOnLine(CreatePoint(1, 1), CreatePoint(2, 2), CreatePoint(1.50f, 1.55f), 0.1f));
Assert.IsTrue(FillPolygon.PointOnLine(CreatePoint(1, 1), CreatePoint(2, 2), CreatePoint(1.50f, 1.45f), 0.1f));
// Near line but outside tolerance
Assert.IsFalse(FillPolygon.PointOnLine(CreatePoint(1, 1), CreatePoint(2, 2), CreatePoint(1.50f, 1.55f), 0.01f));
Assert.IsFalse(FillPolygon.PointOnLine(CreatePoint(1, 1), CreatePoint(2, 2), CreatePoint(1.50f, 1.45f), 0.01f));
// On line but just past end with different accuracy
Assert.IsTrue(FillPolygon.PointOnLine(CreatePoint(1, 1), CreatePoint(2, 2), CreatePoint(2.001f, 2.001f), 0.1f));
Assert.IsTrue(FillPolygon.PointOnLine(CreatePoint(1, 1), CreatePoint(2, 2), CreatePoint(0.999f, 0.999f), 0.1f));
Assert.IsFalse(FillPolygon.PointOnLine(CreatePoint(1, 1), CreatePoint(2, 2), CreatePoint(2.001f, 2.001f), 0.0001f));
Assert.IsFalse(FillPolygon.PointOnLine(CreatePoint(1, 1), CreatePoint(2, 2), CreatePoint(0.999f, 0.999f), 0.0001f));
Assert.IsTrue(FillPolygon.PointOnLine(CreatePoint(1, 1), CreatePoint(2, 1), CreatePoint(1.5f, 1.01f), 0.05f));
Assert.IsTrue(FillPolygon.PointOnLine(CreatePoint(1, 1), CreatePoint(1, 2), CreatePoint(1.0f, 1.01f), 0.05f));
}
[Test]
public void GetBoundingBoxTest()
{
var boundingBox = FillPolygon.GetBoundingBox(new[] { CreatePoint(1, 1), CreatePoint(2, 4) });
Assert.AreEqual(3, boundingBox.Height);
Assert.AreEqual(1, boundingBox.Width);
Assert.AreEqual(1, boundingBox.X);
Assert.AreEqual(1, boundingBox.Y);
boundingBox = FillPolygon.GetBoundingBox(new[] {
CreatePoint(1,1),
CreatePoint(2,1),
CreatePoint(2,2),
CreatePoint(3,2),
CreatePoint(3,1),
CreatePoint(4,1),
CreatePoint(2,7),
});
Assert.AreEqual(6, boundingBox.Height);
Assert.AreEqual(3, boundingBox.Width);
Assert.AreEqual(1, boundingBox.X);
Assert.AreEqual(1, boundingBox.Y);
boundingBox = FillPolygon.GetBoundingBox(new[] {
CreatePoint(2, 1),
CreatePoint(1, 2),
CreatePoint(3, 2),
});
Assert.AreEqual(1, boundingBox.Height);
Assert.AreEqual(2, boundingBox.Width);
Assert.AreEqual(1, boundingBox.X);
Assert.AreEqual(1, boundingBox.Y);
}
[Test]
public void FillPolygonTests2()
{
var dimX = 5;
var dimY = 5;
var polygon1 = new[] {
CreatePoint(-0.5, -0.5),
CreatePoint(dimX + 0.5, -0.5),
CreatePoint(dimX + 0.5,dimY + 0.5),
CreatePoint(-0.5, dimY + 0.5)
};
var output1 = new byte[dimX * dimY];
FillPolygon.Fill(polygon1, output1, dimX, dimY, 0, 0, (byte)1);
for (var i = 0; i < output1.Length; i++)
{
Assert.AreEqual(1, output1[i]);
}
var polygon = new[] {
CreatePoint(0.1, 0.1),
CreatePoint(dimX - 1.1, 0.1),
CreatePoint(dimX - 1.1,dimY - 1.1),
CreatePoint(0.1, dimY - 1.1)
};
var output = new byte[dimX * dimY];
FillPolygon.Fill(polygon, output, dimX, dimY, 0, 0, (byte)1);
for (var y = 0; y < dimY; y++)
{
for (var x = 0; x < dimX; x++)
{
Assert.AreEqual(y == 0 || y == dimY - 1 || x == 0 || x == dimX - 1 ? 0 : 1, output[x + y * dimX]);
}
}
}
[Test]
public void FillPolygonOutsideVolume()
{
var dimX = 5;
var dimY = 5;
var polygon1 = new[] {
CreatePoint(-10.5, -10.5), // Check that if a point is outside the volume this code still works
CreatePoint(dimX + 0.5, -0.5),
CreatePoint(dimX + 0.5,dimY + 0.5),
CreatePoint(-0.5, dimY + 0.5)
};
var output1 = new byte[dimX * dimY];
FillPolygon.Fill(polygon1, output1, dimX, dimY, 0, 0, (byte)1);
for (var i = 0; i < output1.Length; i++)
{
Assert.AreEqual(1, output1[i]);
}
var polygon = new[] {
CreatePoint(0.1,0.1),
CreatePoint(dimX - 1.1, 0.1),
CreatePoint(dimX - 1.1,dimY - 1.1),
CreatePoint(0.1, dimY - 1.1)
};
var output = new byte[dimX * dimY];
FillPolygon.Fill(polygon, output, dimX, dimY, 0, 0, (byte)1);
for (var y = 0; y < dimY; y++)
{
for (var x = 0; x < dimX; x++)
{
Assert.AreEqual(y == 0 || y == dimY - 1 || x == 0 || x == dimX - 1 ? 0 : 1, output[x + y * dimX]);
}
}
}
[Test]
public void FillPolygonTests4()
{
var dimX = 5;
var dimY = 5;
var expectedArray = new byte[]
{
0, 0, 1, 0, 0,
0, 1, 1, 1, 0,
1, 1, 1, 1, 1,
0, 1, 1, 1, 0,
0, 0, 1, 0, 0,
};
var volume2D = new Volume2D<byte>(expectedArray, 5, 5, 1, 1, new Point2D(), new Matrix2());
var extractContour = ExtractContours.ContoursWithHoles(volume2D);
var output1 = new byte[dimX * dimY];
var polygon = extractContour.First().ContourPoints.Select(x => CreatePoint(x.X + 0.00002, x.Y + 0.00001)).ToArray();
FillPolygon.Fill(polygon, output1, dimX, dimY, 0, 0, (byte)1);
for (var i = 0; i < output1.Length; i++)
{
Assert.AreEqual(expectedArray[i], output1[i]);
}
}
[Test]
public void FillPolygonTests5()
{
var dimX = 5;
var dimY = 5;
var expectedArray = new byte[]
{
0, 0, 0, 0, 0,
0, 1, 0, 1, 0,
1, 1, 1, 1, 1,
0, 1, 1, 1, 0,
0, 0, 1, 0, 0,
};
var volume2D = new Volume2D<byte>(expectedArray, 5, 5, 1, 1, new Point2D(), new Matrix2());
var extractContour = ExtractContours.PolygonsFilled(volume2D);
var output1 = new byte[dimX * dimY];
var polygon = extractContour.First().Points.Select(x => CreatePoint(x.X + 0.00002, x.Y + 0.00001)).ToArray();
FillPolygon.Fill(polygon, output1, dimX, dimY, 0, 0, (byte)1);
for (var i = 0; i < output1.Length; i++)
{
Assert.AreEqual(expectedArray[i], output1[i]);
}
}
[Timeout(60 * 1000)]
[Test]
public void FillPolygonTestsRandomCheckTermination()
{
var dimX = 2000;
int seed = Guid.NewGuid().GetHashCode();
Console.WriteLine($"Seed {seed}");
var random = new Random(seed);
var byteArray = Enumerable.Range(0, dimX * dimX).Select(_ => (byte)random.Next(0, 2)).ToArray();
var volume2D = new Volume2D<byte>(byteArray, dimX, dimX, 1, 1, new Point2D(), new Matrix2());
var extractContour = ExtractContours.PolygonsFilled(volume2D);
Console.WriteLine($"Contours count {extractContour.Count}");
Assert.IsTrue(extractContour.Count > 0);
}
[Test]
public void FillPolygonTests6()
{
var dimX = 5;
var dimY = 5;
var expectedArray = new byte[]
{
0, 1, 1, 0, 0,
1, 1, 1, 1, 0,
1, 1, 0, 1, 1,
1, 1, 0, 1, 0,
0, 0, 0, 0, 0,
};
var volume2D = new Volume2D<byte>(expectedArray, 5, 5, 1, 1, new Point2D(), new Matrix2());
var extractContour = ExtractContours.PolygonsFilled(volume2D);
var output1 = new byte[dimX * dimY];
var polygon = extractContour.First().Points.Select(x => CreatePoint(x.X + 0.00002, x.Y - 0.00001)).ToArray();
FillPolygon.Fill(polygon, output1, dimX, dimY, 0, 0, (byte)1);
for (var i = 0; i < output1.Length; i++)
{
Assert.AreEqual(expectedArray[i], output1[i]);
}
}
[Test]
public void FillPolygonTests7()
{
var dimX = 5;
var dimY = 5;
var expectedArray = new byte[]
{
0, 1, 1, 0, 0,
1, 1, 1, 1, 0,
1, 1, 1, 1, 1,
1, 1, 0, 1, 0,
0, 0, 0, 0, 0,
};
var volume2D = new Volume2D<byte>(expectedArray, 5, 5, 1, 1, new Point2D(), new Matrix2());
var extractContour = ExtractContours.PolygonsFilled(volume2D);
var output1 = new byte[dimX * dimY];
var polygon = extractContour.First().Points.Select(x => CreatePoint(x.X + 0.00002, x.Y - 0.00001)).ToArray();
FillPolygon.Fill(polygon, output1, dimX, dimY, 0, 0, (byte)1);
for (var i = 0; i < output1.Length; i++)
{
Assert.AreEqual(expectedArray[i], output1[i]);
}
}
[Test]
public void FillPolygonTests3()
{
var polygon = new[] {
CreatePoint(0.994356,1.00136305698),
CreatePoint(3.0002425,0.99924525),
CreatePoint(2.999235236,2.999252346),
CreatePoint(1.00135357,3.001232363)
};
var boundingBox = FillPolygon.GetBoundingBox(polygon);
Assert.AreEqual(0, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(1, 1), boundingBox));
Assert.AreEqual(0, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(2, 1), boundingBox));
Assert.AreEqual(0, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(3, 1), boundingBox));
Assert.AreEqual(0, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(3, 2), boundingBox));
Assert.AreEqual(0, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(3, 3), boundingBox));
Assert.AreEqual(0, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(2, 3), boundingBox));
Assert.AreEqual(0, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(1, 3), boundingBox));
Assert.AreEqual(0, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(1, 2), boundingBox));
}
[Test]
public void FillPolygonTests1()
{
// Figure of 8
var polygon = new[] {
CreatePoint(2,1),
CreatePoint(3,2),
CreatePoint(3,6),
CreatePoint(3,6), // Double point - interesting case
CreatePoint(5,6),
CreatePoint(5,3),
CreatePoint(2,4),
CreatePoint(1,2),
CreatePoint(2,1),
};
polygon = polygon.Select(x => CreatePoint(x.X - 0.5, x.Y - 0.5)).ToArray();
var dimX = 6;
var dimY = 7;
var output = new byte[dimX * dimY];
FillPolygon.Fill(polygon, output, dimX, dimY, 0, 0, (byte)1);
var resultArray = new byte[]
{
0, 0, 0, 0, 0, 0,
0, 1, 1, 0, 0, 0,
0, 1, 1, 0, 0, 0,
0, 0, 1, 1, 1, 0,
0, 0, 0, 1, 1, 0,
0, 0, 0, 1, 1, 0,
0, 0, 0, 0, 0, 0,
};
Assert.AreEqual(resultArray.Length, output.Length);
for (var i = 0; i < output.Length; i++)
{
Assert.AreEqual(resultArray[i], output[i]);
}
polygon = new[] {
CreatePoint(0,0),
CreatePoint(dimX,0),
CreatePoint(dimX,dimY),
CreatePoint(0,dimY),
CreatePoint(0,0),
};
polygon = polygon.Select(x => CreatePoint(x.X - 0.5, x.Y - 0.5)).ToArray();
FillPolygon.Fill(polygon, output, dimX, dimY, 0, 0, (byte)1);
for (var i = 0; i < output.Length; i++)
{
Assert.AreEqual(1, output[i]);
}
}
[Test]
public void PointInPolygonTests()
{
var polygon = new[] {
CreatePoint(1,1),
CreatePoint(10,1),
CreatePoint(10,10),
CreatePoint(1,10), // Non repeating last value
};
var bounds = FillPolygon.GetBoundingBox(polygon);
Assert.AreEqual(0, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(1, 5), bounds)); // On the last point pair
Assert.AreEqual(0, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(5, 10), bounds));
Assert.AreEqual(1, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(5, 5), bounds));
polygon = new[] {
CreatePoint(1,1),
CreatePoint(10,1),
CreatePoint(10,10),
CreatePoint(9,10),
CreatePoint(8,10),
CreatePoint(7,10),
CreatePoint(6,10),
CreatePoint(5,10),
CreatePoint(4,10),
CreatePoint(3,10),
CreatePoint(2,10),
CreatePoint(1,10),
CreatePoint(1,9),
CreatePoint(1,8),
CreatePoint(1,7),
CreatePoint(1,3),
CreatePoint(1,2),
};
Assert.AreEqual(1, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(5, 5)));
polygon = new[] {
CreatePoint(1,1),
CreatePoint(1,1),
};
Assert.AreEqual(0, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(1, 1)));
Assert.AreEqual(0, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(1.0001, 1.00001)));
// Check all surrounding points
Assert.AreEqual(-1, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(0, 0)));
Assert.AreEqual(-1, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(1, 0)));
Assert.AreEqual(-1, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(2, 0)));
Assert.AreEqual(-1, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(2, 1)));
Assert.AreEqual(-1, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(2, 2)));
Assert.AreEqual(-1, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(1, 2)));
Assert.AreEqual(-1, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(0, 2)));
Assert.AreEqual(-1, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(0, 1)));
polygon = new[] {
CreatePoint(1,1),
CreatePoint(2,1),
CreatePoint(2,2),
CreatePoint(3,2),
CreatePoint(4,2),
CreatePoint(4,1),
CreatePoint(5,1),
CreatePoint(5,4),
CreatePoint(3,3),
CreatePoint(1,4),
CreatePoint(1,1),
};
bounds = FillPolygon.GetBoundingBox(polygon);
Assert.AreEqual(0, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(1, 1), bounds));
Assert.AreEqual(-1, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(3.5, 1.5), bounds));
Assert.AreEqual(-1, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(2, 4), bounds));
Assert.AreEqual(0, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(2, 1), bounds));
polygon = new[] {
CreatePoint(1,1),
CreatePoint(1,2),
CreatePoint(2,2),
CreatePoint(1,1),
};
Assert.AreEqual(0, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(1.5, 1.5)));
Assert.AreEqual(0, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(1.6, 1.6)));
Assert.AreEqual(-1, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(1.6, 1.5)));
// Figure of 8
polygon = new[] {
CreatePoint(2,1),
CreatePoint(3,2),
CreatePoint(3,6),
CreatePoint(3,6), // Double point - interesting case
CreatePoint(5,6),
CreatePoint(5,3),
CreatePoint(2,4),
CreatePoint(1,2),
CreatePoint(2,1),
};
Assert.AreEqual(1, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(2, 3)));
Assert.AreEqual(1, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(4, 4)));
Assert.AreEqual(-1, FillPolygon.PointInComplexPolygon(polygon, CreatePoint(4, 2)));
}
[Test]
public void GetPointsOnDiagonalLineTests()
{
var point1 = CreatePoint(0, 0);
var point2 = CreatePoint(2, 4);
var result1 = FillPolygon.GetPointsOnLine(point1, point2);
CompareArrays(result1, new List<Point>()
{
new Point(0,0),
new Point(0,1),
new Point(1,2),
new Point(1,3),
new Point(2,4)
});
var result2 = FillPolygon.GetPointsOnLine(point2, point1);
CompareArrays(result2, new List<Point>()
{
new Point(0,0),
new Point(0,1),
new Point(1,2),
new Point(1,3),
new Point(2,4)
});
}
[Test]
public void GetPointsOnStraightLineTests()
{
var point1 = CreatePoint(1, 1);
var point2 = CreatePoint(4, 1);
CompareArrays(FillPolygon.GetPointsOnLine(point1, point2),
new List<Point>()
{
new Point(1,1),
new Point(2,1),
new Point(3,1),
new Point(4,1),
});
CompareArrays(FillPolygon.GetPointsOnLine(point2, point1),
new List<Point>()
{
new Point(1,1),
new Point(2,1),
new Point(3,1),
new Point(4,1),
});
}
private void CompareArrays(IReadOnlyList<Point> actual, IReadOnlyList<Point> expected)
{
Assert.AreEqual(actual.Count, expected.Count);
for (var i = 0; i < actual.Count; i++)
{
var actualPoint = actual[i];
var expectedPoint = expected[i];
Assert.AreEqual(expectedPoint.X, actualPoint.X);
Assert.AreEqual(expectedPoint.Y, actualPoint.Y);
}
}
}
}

Просмотреть файл

@ -0,0 +1,115 @@
/// ------------------------------------------------------------------------------------------
/// Copyright (c) Microsoft Corporation. All rights reserved.
/// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information.
/// ------------------------------------------------------------------------------------------
namespace Microsoft.RTConvert.Contours.Tests
{
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.IO;
using Microsoft.RTConvert.Contours;
using Microsoft.RTConvert.Models;
using Microsoft.RTConvert.MedIO.Extensions;
using Microsoft.RTConvert.MedIO.Tests.Extensions;
using NUnit.Framework;
[TestFixture]
public class FloodFillHolesTests
{
private static string GetTestDataPath(string relativePath)
{
return Path.GetFullPath(Path.Combine(TestContext.CurrentContext.TestDirectory, "MaskToContourTestData", relativePath));
}
[TestCase]
public void FloodFillTest3D()
{
var actual = new Volume3D<byte>(3, 3, 3);
// 0 X 0
// X 0 X
// 0 X 0
for (int i= 0; i < 3; i++)
{
actual[1, 0, i] = 1;
actual[0, 1, i] = 1;
actual[2, 1, i] = 1;
actual[1, 2, i] = 1;
}
var expected = actual.Copy();
expected[1, 1, 0] = 1;
expected[1, 1, 1] = 1;
expected[1, 1, 2] = 1;
actual.FillHoles();
CollectionAssert.AreEqual(expected.Array, actual.Array);
}
[TestCase("mask1.png")]
[TestCase("mask2.png")]
[TestCase("mask3.png")]
[TestCase("mask4.png")]
[TestCase("holes2.png")]
public void FloodFillTest2(string filename)
{
var path = GetTestDataPath(filename);
var image = new Bitmap(path);
var mask = image.ToByteArray();
Assert.IsTrue(mask.Any(x => x == 0));
Assert.IsTrue(mask.Any(x => x == 1));
Assert.IsTrue(mask.Length == image.Width * image.Height);
var actual = new Volume2D<byte>(mask, image.Width, image.Height, 1, 1, new Point2D(), new Matrix2());
var contoursFilled = actual.ContoursFilled();
var expected = actual.CreateSameSize<byte>();
expected.Fill(contoursFilled, (byte)1);
var stopwatch = Stopwatch.StartNew();
FillPolygon.FloodFillHoles(actual.Array, expected.DimX, expected.DimY, 0, 0, 1, 0);
stopwatch.Stop();
actual.SaveBrushVolumeToPng(@"C:\Temp\Actual.png");
expected.SaveBrushVolumeToPng(@"C:\Temp\Expected.png");
Assert.AreEqual(expected.Array, actual.Array, "Extracting filled contours and filling those should give the same result as flood filling holes.");
var contoursWithHoles = actual.ContoursWithHoles();
var filledWithHoles = actual.CreateSameSize<byte>();
filledWithHoles.Fill(contoursWithHoles, (byte)1);
Assert.AreEqual(actual.Array, filledWithHoles.Array, "Extracting contours with holes and filling those in should not change the mask");
}
[TestCase()]
public void FloodFillTest3()
{
var actual = new Volume3D<byte>(3, 3, 3);
// X X X
// X 0 X
// X X X
for (var i = 0; i < actual.Length; i++)
{
actual[i] = 1;
}
actual[1, 1, 0] = 0;
actual[1, 1, 1] = 0;
actual[1, 1, 2] = 0;
var expected = actual.Copy();
expected[1, 1, 0] = 1;
expected[1, 1, 1] = 1;
expected[1, 1, 2] = 1;
actual.FillHoles();
CollectionAssert.AreEqual(expected.Array, actual.Array);
}
}
}

Просмотреть файл

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9cb00e3632d702697f6841d9b6a07399884b7809bbf2dabfa86b1ef83df59a0b
size 181

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше