This commit is contained in:
Коммит
b6edf68fa6
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -0,0 +1,9 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>netcoreapp2.1</TargetFramework>
|
||||
<Platforms>x64</Platforms>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
|
@ -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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
|
@ -0,0 +1,2 @@
|
|||
include LICENSE
|
||||
graft src/InnerEye_DICOM_RT/bin
|
|
@ -0,0 +1,8 @@
|
|||
init:
|
||||
pip install -r requirements.txt
|
||||
|
||||
test:
|
||||
pytest tests
|
||||
|
||||
build:
|
||||
python setup.py sdist bdist_wheel
|
|
@ -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
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче