Merge branch 'release-2.2.0'
This commit is contained in:
commit
2a3ff8c63e
10
HISTORY.md
10
HISTORY.md
@ -1,3 +1,13 @@
|
|||||||
|
Version 2.2.0 (2015-12-03)
|
||||||
|
========================================================================
|
||||||
|
|
||||||
|
- NEU: Funktion zum Formatieren der Medikationsliste.
|
||||||
|
- VERBESSERT: Kohlehydratdefizientes Transferrin hinzugefügt (als 'CDT') und Ambulanzstil angepaßt.
|
||||||
|
- VERBESSERT: Referenzbereiche zu Immunologie-Vorlage im Ambulanzstil hinzugefügt.
|
||||||
|
|
||||||
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
|
|
||||||
|
|
||||||
Version 2.1.13 (2015-11-12)
|
Version 2.1.13 (2015-11-12)
|
||||||
========================================================================
|
========================================================================
|
||||||
|
|
||||||
|
45
Tests/Medication/ImporterTest.cs
Executable file
45
Tests/Medication/ImporterTest.cs
Executable file
@ -0,0 +1,45 @@
|
|||||||
|
/* ImporterTest.cs
|
||||||
|
* part of zaaReloaded2
|
||||||
|
*
|
||||||
|
* Copyright 2015 Daniel Kraus
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using NUnit.Framework;
|
||||||
|
|
||||||
|
namespace Tests.Medication
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
class ImporterTest
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void ImportDrugsTwoColumns()
|
||||||
|
{
|
||||||
|
string s =
|
||||||
|
"Aktuelle Medikation:\r" +
|
||||||
|
"Advagraf 1 mg 2-0-0 CellCept 500 mg 1-0-1\r" +
|
||||||
|
"CellCept 250 mg 1-0-1 Decortin 10 mg 1-0-0\r" +
|
||||||
|
"Beloc-Zok mite 1-0-1 Ramipril 5 mg 0-0-1 (neu)\r" +
|
||||||
|
"Pantozol 40 mg 0-0-1 Decostriol 0,5 µg 2-0-0\r" +
|
||||||
|
"Euthyrox 200 µg 1-1-1 (gesteigert) Ossofortin forte 1-0-1\r" +
|
||||||
|
"Vfend 200 mg 2-0-2 CPS-Pulver 0-1-0\r" +
|
||||||
|
"Cyklokapron 500 mg 1-1-1 Tamsulosin 0,4 mg 1-0-0 ";
|
||||||
|
zaaReloaded2.Medication.Importer i = new zaaReloaded2.Medication.Importer(s);
|
||||||
|
Assert.AreEqual(14, i.Prescriptions.Count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
128
Tests/Medication/PrescriptionTest.cs
Executable file
128
Tests/Medication/PrescriptionTest.cs
Executable file
@ -0,0 +1,128 @@
|
|||||||
|
/* PrescriptionTest.cs
|
||||||
|
* part of zaaReloaded2
|
||||||
|
*
|
||||||
|
* Copyright 2015 Daniel Kraus
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using zaaReloaded2.Medication;
|
||||||
|
|
||||||
|
namespace Tests.Medication
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
class PrescriptionTest
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
[TestCase("Ramipril 5 mg 1-2-3", "Ramipril 5 mg", "1", "2", "3")]
|
||||||
|
[TestCase("Ramipril 5 mg 1 -2 - 3", "Ramipril 5 mg", "1", "2", "3")]
|
||||||
|
[TestCase("Ramipril 5 mg 1 - 2 - 3", "Ramipril 5 mg", "1", "2", "3")]
|
||||||
|
[TestCase("Ramipril 5 mg 1 - 2 - 3", "Ramipril 5 mg", "1", "2", "3")]
|
||||||
|
[TestCase("Ramipril 5 mg 1 1/2-2-3", "Ramipril 5 mg", "1 1/2", "2", "3")]
|
||||||
|
[TestCase("Ramipril 5 mg 1 1/2 - 2 - 3", "Ramipril 5 mg", "1 1/2", "2", "3")]
|
||||||
|
[TestCase("Ramipril 5 mg ½-⅓-¼", "Ramipril 5 mg", "½", "⅓", "¼")]
|
||||||
|
public void ParseLine(string line, string drug, string morning,
|
||||||
|
string noon, string evening)
|
||||||
|
{
|
||||||
|
Prescription p = Prescription.FromLine(line);
|
||||||
|
Assert.AreEqual(drug, p.Drug, "Drug should be " + drug);
|
||||||
|
Assert.AreEqual(morning, p.Morning, "Morning should be " + morning);
|
||||||
|
Assert.AreEqual(noon, p.Noon, "Noon should be " + noon);
|
||||||
|
Assert.AreEqual(evening, p.Evening, "Evening should be " + evening);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void MultiplePrescriptions()
|
||||||
|
{
|
||||||
|
IEnumerable<Prescription> list = Prescription.ManyFromLine(
|
||||||
|
"Ramipril 5 mg 1-0-0 \t Prograf 1 mg 1-0-1");
|
||||||
|
Assert.AreEqual(2, list.Count());
|
||||||
|
Assert.AreEqual("Ramipril 5 mg\t1-0-0", list.First().ToString());
|
||||||
|
Assert.AreEqual("Prograf 1 mg\t1-0-1", list.Last().ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
[TestCase("Ramipril 5 mg", "1", "0", "0", "0", "Ramipril 5 mg\t1-0-0-0")]
|
||||||
|
[TestCase("Ramipril 5 mg", "1", "0", "0", "", "Ramipril 5 mg\t1-0-0")]
|
||||||
|
[TestCase("Ramipril 5 mg", "1", "0", "", "", "Ramipril 5 mg\t1-0")]
|
||||||
|
[TestCase("Ramipril 5 mg", "1", "", "", "", "Ramipril 5 mg\t1")]
|
||||||
|
[TestCase("Ramipril 5 mg", "1", "", "0", "0", "Ramipril 5 mg\t1-0-0-0")]
|
||||||
|
[TestCase("Ramipril 5 mg", "1", "0", "", "0", "Ramipril 5 mg\t1-0-0-0")]
|
||||||
|
[TestCase("Ramipril 5 mg", "1", "", "", "0", "Ramipril 5 mg\t1-0-0-0")]
|
||||||
|
[TestCase("Ramipril 5 mg", "", "", "", "", "Ramipril 5 mg\t")]
|
||||||
|
public void PrescriptionToString(string drug, string morning, string noon,
|
||||||
|
string evening, string night, string formatted)
|
||||||
|
{
|
||||||
|
Prescription p = new Prescription(drug, morning, noon, evening, night);
|
||||||
|
Assert.AreEqual(formatted, p.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void PrescriptionWithComment()
|
||||||
|
{
|
||||||
|
Prescription p = Prescription.FromLine("Ramipril 5 mg 1-0-2 (gesteigert)");
|
||||||
|
Assert.AreEqual("Ramipril 5 mg", p.Drug);
|
||||||
|
Assert.AreEqual("1", p.Morning);
|
||||||
|
Assert.AreEqual("0", p.Noon);
|
||||||
|
Assert.AreEqual("2", p.Evening);
|
||||||
|
Assert.AreEqual("(gesteigert)", p.Comment);
|
||||||
|
Assert.AreEqual("Ramipril 5 mg\t1-0-2 (gesteigert)", p.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void PrescriptionsLineWithComment()
|
||||||
|
{
|
||||||
|
IList<Prescription> list = Prescription.ManyFromLine(
|
||||||
|
"Ramipril 5 mg 1-0-2 (gesteigert) \t Concor 2,5 mg 3-2-1-0 neu");
|
||||||
|
Assert.AreEqual(2, list.Count);
|
||||||
|
Assert.AreEqual("Ramipril 5 mg", list[0].Drug);
|
||||||
|
Assert.AreEqual("1", list[0].Morning);
|
||||||
|
Assert.AreEqual("0", list[0].Noon);
|
||||||
|
Assert.AreEqual("2", list[0].Evening);
|
||||||
|
Assert.AreEqual("", list[0].Night);
|
||||||
|
Assert.AreEqual("(gesteigert)", list[0].Comment);
|
||||||
|
Assert.AreEqual("Concor 2,5 mg", list[1].Drug);
|
||||||
|
Assert.AreEqual("3", list[1].Morning);
|
||||||
|
Assert.AreEqual("2", list[1].Noon);
|
||||||
|
Assert.AreEqual("1", list[1].Evening);
|
||||||
|
Assert.AreEqual("0", list[1].Night);
|
||||||
|
Assert.AreEqual("neu", list[1].Comment);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void PrescriptionWithoutTypicalDosing()
|
||||||
|
{
|
||||||
|
Prescription p = Prescription.FromLine("Eusaprim forte\t alle zwei Tage");
|
||||||
|
Assert.AreEqual("Eusaprim forte", p.Drug);
|
||||||
|
Assert.AreEqual("alle zwei Tage", p.Comment);
|
||||||
|
Assert.AreEqual("Eusaprim forte\talle zwei Tage", p.ToString(), "ToString");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
[TestCase("CellCept 500 mg", true)]
|
||||||
|
[TestCase("Cell CEpt 500 mg", true)]
|
||||||
|
[TestCase("Myfortic", true)]
|
||||||
|
[TestCase("Mycophenolatmofetil 500 mg", true)]
|
||||||
|
[TestCase("Cellophan 5 g", false)]
|
||||||
|
[TestCase("MMF 500 mg", true)]
|
||||||
|
public void MmfProperty(string drug, bool isMmf)
|
||||||
|
{
|
||||||
|
Prescription p = new Prescription(drug);
|
||||||
|
Assert.AreEqual(isMmf, p.IsMmf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -83,6 +83,8 @@
|
|||||||
<Compile Include="Controller\Comments\CommentPoolTest.cs" />
|
<Compile Include="Controller\Comments\CommentPoolTest.cs" />
|
||||||
<Compile Include="Controller\Comments\ItemCommentTest.cs" />
|
<Compile Include="Controller\Comments\ItemCommentTest.cs" />
|
||||||
<Compile Include="Controller\Elements\CloneTest.cs" />
|
<Compile Include="Controller\Elements\CloneTest.cs" />
|
||||||
|
<Compile Include="Medication\ImporterTest.cs" />
|
||||||
|
<Compile Include="Medication\PrescriptionTest.cs" />
|
||||||
<Compile Include="SerializationTest.cs" />
|
<Compile Include="SerializationTest.cs" />
|
||||||
<Compile Include="Controller\SettingsRepositoryTest.cs" />
|
<Compile Include="Controller\SettingsRepositoryTest.cs" />
|
||||||
<Compile Include="Controller\SettingsTest.cs" />
|
<Compile Include="Controller\SettingsTest.cs" />
|
||||||
|
BIN
gimp/m.xcf
Normal file
BIN
gimp/m.xcf
Normal file
Binary file not shown.
BIN
gimp/mm.xcf
Normal file
BIN
gimp/mm.xcf
Normal file
Binary file not shown.
@ -1,4 +1,4 @@
|
|||||||
2.1.13
|
2.2.0
|
||||||
http://zaa.nephrowiki.de/downloads/zaaReloaded-$VERSION.exe
|
http://zaa.nephrowiki.de/downloads/zaaReloaded-$VERSION.exe
|
||||||
8dc26f4c80bb91a9384c6cf3818b411e3056bb15b00c334eac5edafa764a52f0 publish/release/zaaReloaded-2.1.13.exe
|
aef576f192cb58aef59670df6407e36e2403675dc558af56430babbd218b6c0e publish/release/zaaReloaded-2.2.0.exe
|
||||||
|
|
||||||
|
@ -138,6 +138,47 @@ namespace zaaReloaded2
|
|||||||
Globals.ThisAddIn.Application.Selection);
|
Globals.ThisAddIn.Application.Selection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void FormatDrugs(int columns)
|
||||||
|
{
|
||||||
|
if (columns < 1 || columns > 2)
|
||||||
|
{
|
||||||
|
throw new ArgumentOutOfRangeException("Can only format 1 or 2 columns, not " + columns);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no "real" selection exists, attempt to auto-detect the drugs section.
|
||||||
|
// (NB Technically, there is never _no_ selection in a document.)
|
||||||
|
Word.Window activeWindow = Globals.ThisAddIn.Application.ActiveWindow;
|
||||||
|
Word.Selection sel = activeWindow.Selection;
|
||||||
|
if (!(sel.Paragraphs.Count > 1
|
||||||
|
|| (sel.Text.Length > 1 && sel.Text.EndsWith("\r"))))
|
||||||
|
{
|
||||||
|
if (!Medication.Importer.AutoDetect(activeWindow.Document))
|
||||||
|
{
|
||||||
|
NotificationAction a = new NotificationAction();
|
||||||
|
a.Caption = "Formatieren nicht möglich";
|
||||||
|
a.Message = "Das Dokument scheint keine Medikationsliste zu enthalten.";
|
||||||
|
a.OkButtonLabel = "Schließen";
|
||||||
|
a.Invoke();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Medication.Importer importer = new Medication.Importer(activeWindow.Selection.Text);
|
||||||
|
Medication.Formatter formatter = new Medication.Formatter(importer.Prescriptions);
|
||||||
|
|
||||||
|
switch (columns)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
formatter.FormatOneColumn(activeWindow.Document);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
formatter.FormatTwoColumns(activeWindow.Document);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Private methods
|
#region Private methods
|
||||||
|
@ -3,17 +3,17 @@
|
|||||||
<a1:Settings id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
<a1:Settings id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||||
<Version>2</Version>
|
<Version>2</Version>
|
||||||
<Uid xsi:type="a2:Guid" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
|
<Uid xsi:type="a2:Guid" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
|
||||||
<_a>1024466373</_a>
|
<_a>-903942278</_a>
|
||||||
<_b>-13000</_b>
|
<_b>-22298</_b>
|
||||||
<_c>18257</_c>
|
<_c>17811</_c>
|
||||||
<_d>175</_d>
|
<_d>139</_d>
|
||||||
<_e>25</_e>
|
<_e>190</_e>
|
||||||
<_f>195</_f>
|
<_f>233</_f>
|
||||||
<_g>192</_g>
|
<_g>83</_g>
|
||||||
<_h>189</_h>
|
<_h>158</_h>
|
||||||
<_i>241</_i>
|
<_i>73</_i>
|
||||||
<_j>139</_j>
|
<_j>21</_j>
|
||||||
<_k>63</_k>
|
<_k>115</_k>
|
||||||
</Uid>
|
</Uid>
|
||||||
<Name id="ref-3">Kopie von Standard für NepA</Name>
|
<Name id="ref-3">Kopie von Standard für NepA</Name>
|
||||||
<ReferenceStyle xsi:type="a3:ReferenceStyle" xmlns:a3="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Formatter/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">IfSpecialItem</ReferenceStyle>
|
<ReferenceStyle xsi:type="a3:ReferenceStyle" xmlns:a3="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Formatter/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">IfSpecialItem</ReferenceStyle>
|
||||||
@ -106,7 +106,7 @@
|
|||||||
</a4:Items>
|
</a4:Items>
|
||||||
<a4:Items id="ref-15" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
<a4:Items id="ref-15" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||||
<Version>2</Version>
|
<Version>2</Version>
|
||||||
<Content id="ref-39">Leber: GOT, GGT, GPT, AP, Bilirubin, CHE</Content>
|
<Content id="ref-39">Leber: GOT, GGT, GPT, AP, Bilirubin, CHE, CDT</Content>
|
||||||
</a4:Items>
|
</a4:Items>
|
||||||
<a4:Items id="ref-16" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
<a4:Items id="ref-16" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||||
<Version>2</Version>
|
<Version>2</Version>
|
||||||
@ -171,7 +171,7 @@
|
|||||||
</a4:CustomText>
|
</a4:CustomText>
|
||||||
<a4:CustomText id="ref-31" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
<a4:CustomText id="ref-31" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
|
||||||
<Version>2</Version>
|
<Version>2</Version>
|
||||||
<Content id="ref-55">Autoantikörper: ANCA (IF), MPO-ANCA (ELISA), PR3-ANCA (ELISA), ANA (IF), AnDNA (ELISA), AnDNA (RIA)</Content>
|
<Content id="ref-55">Autoantikörper: ANCA (IF) 1: (Ref. < 1:40), MPO-ANCA (ELISA) IU/ml (Ref. < 9), PR3-ANCA (ELISA) IU/ml (Ref. < 3,5), ANA (IF), AnDNA (ELISA), AnDNA (RIA)</Content>
|
||||||
</a4:CustomText>
|
</a4:CustomText>
|
||||||
</SOAP-ENV:Body>
|
</SOAP-ENV:Body>
|
||||||
</SOAP-ENV:Envelope>
|
</SOAP-ENV:Envelope>
|
||||||
|
@ -81,6 +81,7 @@ Kalium K S
|
|||||||
"Kalium (SU)" K U
|
"Kalium (SU)" K U
|
||||||
"Kalium (SU)/die" K SU
|
"Kalium (SU)/die" K SU
|
||||||
"Ketonkörper (U)" KK U
|
"Ketonkörper (U)" KK U
|
||||||
|
"kohlenhyd. def. Transferrin" CDT S 1 X
|
||||||
"Komplementfaktor C3c" C3c S --- X
|
"Komplementfaktor C3c" C3c S --- X
|
||||||
"Komplementfaktor C4" C4 S --- X
|
"Komplementfaktor C4" C4 S --- X
|
||||||
"Lactat Dehydrogenase" LDH S
|
"Lactat Dehydrogenase" LDH S
|
||||||
|
Binary file not shown.
@ -171,6 +171,14 @@ namespace zaaReloaded2.Formatter
|
|||||||
_buffer.AppendLine(text);
|
_buffer.AppendLine(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Appends a newline to the buffer.
|
||||||
|
/// </summary>
|
||||||
|
public void WriteLine()
|
||||||
|
{
|
||||||
|
_buffer.AppendLine();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Inserts text at the start of the buffer.
|
/// Inserts text at the start of the buffer.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -142,13 +142,7 @@ namespace zaaReloaded2.Formatter
|
|||||||
// Create undo record and styles prior to iterating over the elements
|
// Create undo record and styles prior to iterating over the elements
|
||||||
// because a column switching element might trigger output to the
|
// because a column switching element might trigger output to the
|
||||||
// document.
|
// document.
|
||||||
bool hasAddin = Globals.ThisAddIn != null;
|
Helpers.StartUndo("Laborformatierung");
|
||||||
if (hasAddin)
|
|
||||||
{
|
|
||||||
Globals.ThisAddIn.Application.UndoRecord.StartCustomRecord(
|
|
||||||
String.Format("Laborformatierung ({0})", Properties.Settings.Default.AddinName)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
CreateStyles();
|
CreateStyles();
|
||||||
|
|
||||||
int current = 0;
|
int current = 0;
|
||||||
@ -177,10 +171,7 @@ namespace zaaReloaded2.Formatter
|
|||||||
}
|
}
|
||||||
|
|
||||||
_secondaryBuffer.Flush();
|
_secondaryBuffer.Flush();
|
||||||
if (hasAddin)
|
Helpers.EndUndo();
|
||||||
{
|
|
||||||
Globals.ThisAddIn.Application.UndoRecord.EndCustomRecord();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
69
zaaReloaded2/Helpers.cs
Executable file
69
zaaReloaded2/Helpers.cs
Executable file
@ -0,0 +1,69 @@
|
|||||||
|
/* Helpers.cs
|
||||||
|
* part of zaaReloaded2
|
||||||
|
*
|
||||||
|
* Copyright 2015 Daniel Kraus
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace zaaReloaded2
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Common helper methods.
|
||||||
|
/// </summary>
|
||||||
|
public static class Helpers
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Splits a text into paragraphs.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="paragraph">Text to split.</param>
|
||||||
|
/// <returns>Array of paragraphs in the text.</returns>
|
||||||
|
/// <remarks>
|
||||||
|
/// This implementation relies on the fact that the order of
|
||||||
|
/// splitting strings in C#'s String.Split() method is
|
||||||
|
/// important; see http://stackoverflow.com/a/8664639/270712
|
||||||
|
/// </remarks>
|
||||||
|
public static string[] SplitParagraphs(string text)
|
||||||
|
{
|
||||||
|
return text.Split(
|
||||||
|
new string[] { "\r\n", "\n\r", "\r", "\n" },
|
||||||
|
StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Starts a custom undo record.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="message"></param>
|
||||||
|
public static void StartUndo(string message)
|
||||||
|
{
|
||||||
|
if (Globals.ThisAddIn != null)
|
||||||
|
{
|
||||||
|
Globals.ThisAddIn.Application.UndoRecord.StartCustomRecord(
|
||||||
|
String.Format("{0} ({1})", message, Properties.Settings.Default.AddinName)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ends an undo record.
|
||||||
|
/// </summary>
|
||||||
|
public static void EndUndo()
|
||||||
|
{
|
||||||
|
if (Globals.ThisAddIn != null)
|
||||||
|
{
|
||||||
|
Globals.ThisAddIn.Application.UndoRecord.EndCustomRecord();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
zaaReloaded2/Icons/m.png
Normal file
BIN
zaaReloaded2/Icons/m.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 778 B |
BIN
zaaReloaded2/Icons/mm.png
Normal file
BIN
zaaReloaded2/Icons/mm.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 723 B |
@ -67,12 +67,7 @@ namespace zaaReloaded2.Importer.ZaaImporter
|
|||||||
/// <param name="text">ZAA-formatted Lauris output to import.</param>
|
/// <param name="text">ZAA-formatted Lauris output to import.</param>
|
||||||
public void Import(string text)
|
public void Import(string text)
|
||||||
{
|
{
|
||||||
// Split the text into parargraphs. This implementation relies on the fact
|
string[] paragraphs = Helpers.SplitParagraphs(text);
|
||||||
// that the order or splitting strings in C#'s String.Split() method is
|
|
||||||
// important; see http://stackoverflow.com/a/8664639/270712
|
|
||||||
string[] paragraphs = text.Split(
|
|
||||||
new string[] { "\r\n", "\n\r", "\r", "\n" },
|
|
||||||
StringSplitOptions.RemoveEmptyEntries);
|
|
||||||
LaurisTimePoint timePoint = null;
|
LaurisTimePoint timePoint = null;
|
||||||
|
|
||||||
foreach (string paragraph in paragraphs)
|
foreach (string paragraph in paragraphs)
|
||||||
|
210
zaaReloaded2/Medication/Formatter.cs
Executable file
210
zaaReloaded2/Medication/Formatter.cs
Executable file
@ -0,0 +1,210 @@
|
|||||||
|
using Microsoft.Office.Interop.Word;
|
||||||
|
/* Formatter.cs
|
||||||
|
* part of zaaReloaded2
|
||||||
|
*
|
||||||
|
* Copyright 2015 Daniel Kraus
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace zaaReloaded2.Medication
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Formats prescriptions
|
||||||
|
/// </summary>
|
||||||
|
public class Formatter
|
||||||
|
{
|
||||||
|
#region Properties
|
||||||
|
|
||||||
|
public IList<Prescription> Prescriptions { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Constructor
|
||||||
|
|
||||||
|
public Formatter() { }
|
||||||
|
|
||||||
|
public Formatter(IList<Prescription> prescriptions)
|
||||||
|
: this()
|
||||||
|
{
|
||||||
|
Prescriptions = prescriptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Methods
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Writes a block of prescriptions with one column to a
|
||||||
|
/// Word document.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="document"></param>
|
||||||
|
public void FormatOneColumn(Document document)
|
||||||
|
{
|
||||||
|
DoFormat("Medikation einspaltig formatieren",
|
||||||
|
document,
|
||||||
|
writer =>
|
||||||
|
{
|
||||||
|
foreach (Prescription p in Prescriptions)
|
||||||
|
{
|
||||||
|
writer.WriteLine(p.ToString());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Writes a block of prescriptions with two columns to a
|
||||||
|
/// Word document.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="document"></param>
|
||||||
|
public void FormatTwoColumns(Document document)
|
||||||
|
{
|
||||||
|
DoFormat("Medikation zweispaltig formatieren",
|
||||||
|
document,
|
||||||
|
writer =>
|
||||||
|
{
|
||||||
|
int half = Prescriptions.Count / 2 + Prescriptions.Count % 2;
|
||||||
|
for (int i = 0; i < half; i++)
|
||||||
|
{
|
||||||
|
writer.Write(Prescriptions[i].ToString());
|
||||||
|
if (i + half < Prescriptions.Count)
|
||||||
|
{
|
||||||
|
writer.Write("\t" + Prescriptions[i + half].ToString());
|
||||||
|
}
|
||||||
|
writer.WriteLine();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a table containing all prescriptions and copies it to
|
||||||
|
/// the clipboard.
|
||||||
|
/// </summary>
|
||||||
|
public void CreatePrescriptionsTable()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Private methods
|
||||||
|
|
||||||
|
void AddDisclaimer(zaaReloaded2.Formatter.DocumentWriter writer)
|
||||||
|
{
|
||||||
|
if (HasMMF())
|
||||||
|
{
|
||||||
|
writer.WriteLine();
|
||||||
|
writer.WriteLine("<b>Hinweis: Während und nach Therapie mit Mycophenolsäurederivaten wie CellCept\u00ae " +
|
||||||
|
"und Myfortic\u00ae müssen Frauen und Männer eine Schwangerschaft sicher verhüten (siehe Rote-Hand-Brief zu " +
|
||||||
|
"CellCept\u00ae vom 10.11.2015).</b>");
|
||||||
|
writer.WriteLine();
|
||||||
|
}
|
||||||
|
writer.WriteLine("<highlight><b>Bitte Medikation überprüfen!</b></highlight>");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a paragraph and character styles in the document.
|
||||||
|
/// </summary>
|
||||||
|
void CreateStyles(Document document)
|
||||||
|
{
|
||||||
|
if (document != null)
|
||||||
|
{
|
||||||
|
Style style;
|
||||||
|
// Don't see a better way to check for the existence of a particular
|
||||||
|
// paragraph style than by using a try...catch construction.
|
||||||
|
try
|
||||||
|
{
|
||||||
|
style = document.Styles[Properties.Settings.Default.DrugsParagraph];
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Add default paragraph style for laboratory
|
||||||
|
style = document.Styles.Add(Properties.Settings.Default.DrugsParagraph);
|
||||||
|
style.Font.Size = 10; // pt
|
||||||
|
style.Font.Bold = 0;
|
||||||
|
style.Font.Italic = 0;
|
||||||
|
style.Font.Underline = 0;
|
||||||
|
style.ParagraphFormat.SpaceAfter = 0;
|
||||||
|
style.ParagraphFormat.SpaceBefore = 0;
|
||||||
|
style.ParagraphFormat.LeftIndent = 0; // pt
|
||||||
|
style.ParagraphFormat.FirstLineIndent = 0; // pt
|
||||||
|
style.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphLeft;
|
||||||
|
style.ParagraphFormat.TabStops.ClearAll();
|
||||||
|
int tabStop = 108; // 108 pt = 2.5 in = 3.8 cm
|
||||||
|
int halfWay = 227; // 227 pt = 3.15 in = 8 cm
|
||||||
|
style.ParagraphFormat.TabStops.Add(tabStop);
|
||||||
|
style.ParagraphFormat.TabStops.Add(halfWay);
|
||||||
|
style.ParagraphFormat.TabStops.Add(halfWay + tabStop);
|
||||||
|
}
|
||||||
|
|
||||||
|
// try
|
||||||
|
// {
|
||||||
|
// style = document.Styles[Properties.Settings.Default.DrugsHeader];
|
||||||
|
// }
|
||||||
|
// catch
|
||||||
|
// {
|
||||||
|
// // Add header paragraph style for laboratory
|
||||||
|
// style = document.Styles.Add(Properties.Settings.Default.DrugsHeader);
|
||||||
|
// style.Font.Size = 10; // pt
|
||||||
|
// style.Font.Bold = 1;
|
||||||
|
// style.Font.Italic = 0;
|
||||||
|
// style.Font.Underline = WdUnderline.wdUnderlineSingle;
|
||||||
|
// style.ParagraphFormat.SpaceAfter = 0;
|
||||||
|
// style.ParagraphFormat.SpaceBefore = 12;
|
||||||
|
// style.ParagraphFormat.LeftIndent = 36; // pt
|
||||||
|
// style.ParagraphFormat.FirstLineIndent = -36; // pt
|
||||||
|
// style.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphJustify;
|
||||||
|
// style.set_NextParagraphStyle(document.Styles[Properties.Settings.Default.DrugsParagraph]);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Does the heavy lifting in a DRY way.
|
||||||
|
/// </summary>
|
||||||
|
void DoFormat(string description, Document document,
|
||||||
|
Action<zaaReloaded2.Formatter.DocumentWriter> outputAction)
|
||||||
|
{
|
||||||
|
if (document == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(
|
||||||
|
"Cannot format prescriptions because no document was given.");
|
||||||
|
}
|
||||||
|
|
||||||
|
Helpers.StartUndo(description);
|
||||||
|
zaaReloaded2.Formatter.DocumentWriter writer = new zaaReloaded2.Formatter.DocumentWriter(document);
|
||||||
|
CreateStyles(document);
|
||||||
|
writer.Write(String.Format("<style:{0}>", Properties.Settings.Default.DrugsParagraph));
|
||||||
|
outputAction(writer);
|
||||||
|
AddDisclaimer(writer);
|
||||||
|
// writer.Write("</style>"); // causes COM exceptions, needs fix
|
||||||
|
writer.Flush();
|
||||||
|
Helpers.EndUndo();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determines whether MMF or MPA is contained in the prescriptions.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>True if MMF or MPA is prescribed.</returns>
|
||||||
|
bool HasMMF()
|
||||||
|
{
|
||||||
|
return Prescriptions.FirstOrDefault(p => p.IsMmf) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
208
zaaReloaded2/Medication/Importer.cs
Executable file
208
zaaReloaded2/Medication/Importer.cs
Executable file
@ -0,0 +1,208 @@
|
|||||||
|
using Microsoft.Office.Interop.Word;
|
||||||
|
/* Importer.cs
|
||||||
|
* part of zaaReloaded2
|
||||||
|
*
|
||||||
|
* Copyright 2015 Daniel Kraus
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace zaaReloaded2.Medication
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Imports prescriptions from a physician's letter.
|
||||||
|
/// </summary>
|
||||||
|
public class Importer
|
||||||
|
{
|
||||||
|
#region Static methods
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Attempts to automatically detect a block of prescriptions
|
||||||
|
/// in a document. The document is screened from end to start.
|
||||||
|
/// The detected block is selected.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>True if a block was detected, false if not.</returns>
|
||||||
|
/// <remarks>
|
||||||
|
/// <para>
|
||||||
|
/// Autodetection works by examining the document paragraph by
|
||||||
|
/// paragraph, starting at the end of the document. The first
|
||||||
|
/// block of at least two lines that are identified as prescription
|
||||||
|
/// lines is selected.
|
||||||
|
/// </para>
|
||||||
|
/// <para>
|
||||||
|
/// It should be noted that every paragraph (a.k.a. line) may
|
||||||
|
/// be regarded as one of three things:
|
||||||
|
/// </para>
|
||||||
|
/// <list type="ol">
|
||||||
|
/// <item>A typical prescription line (in the form "Ramipril 5 mg 1-0-0")</item>
|
||||||
|
/// <item>A typical non-prescription text line</item>
|
||||||
|
/// <item>Something inbetween, e.g. a line with tab stops as in
|
||||||
|
/// "Ramipril 5 mg \t alle zwei Tage" or in "Prof. B. Oss \t Dr. A. Sistent"
|
||||||
|
/// </item>
|
||||||
|
/// </list>
|
||||||
|
/// <para>
|
||||||
|
/// It is the third type of line that may cause confusion. If such a line
|
||||||
|
/// is encountered at the start of a putative block of prescriptions, we
|
||||||
|
/// therefore enter a "fuzzy" state in the detection algorithm and take
|
||||||
|
/// it from there, i.e. disregard the block if there are no lines that
|
||||||
|
/// are clearly prescriptions lines, or accept the block if we do detect
|
||||||
|
/// adjacent lines with unequivocal prescriptions.
|
||||||
|
/// </para>
|
||||||
|
///
|
||||||
|
/// </remarks>
|
||||||
|
public static bool AutoDetect(Document document)
|
||||||
|
{
|
||||||
|
Paragraph start = null;
|
||||||
|
Paragraph end = null;
|
||||||
|
bool insideBlock = false;
|
||||||
|
bool fuzzy = false;
|
||||||
|
bool result = false;
|
||||||
|
int i = document.Paragraphs.Count;
|
||||||
|
|
||||||
|
while (i > 1)
|
||||||
|
{
|
||||||
|
string line = document.Paragraphs[i].Range.Text;
|
||||||
|
|
||||||
|
if (Prescription.IsCanonicalPrescriptionLine(line))
|
||||||
|
{
|
||||||
|
// The current line is unequivocally a prescription line:
|
||||||
|
// If we're not inside a block already, mark the bottom
|
||||||
|
// of the block.
|
||||||
|
// If we are inside a block already, make sure to leave
|
||||||
|
// the 'fuzzy' state because this clearly now is a prescription
|
||||||
|
// block.
|
||||||
|
if (insideBlock)
|
||||||
|
{
|
||||||
|
fuzzy = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
end = document.Paragraphs[i];
|
||||||
|
insideBlock = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (Prescription.IsPotentialPrescriptionLine(line))
|
||||||
|
{
|
||||||
|
// The current line is a putative prescription line:
|
||||||
|
// If we're not inside a block already, enter the
|
||||||
|
// "fuzzy" state.
|
||||||
|
// If we are inside a block, no special action is
|
||||||
|
// needed, we can continue with the next paragraph.
|
||||||
|
if (!insideBlock)
|
||||||
|
{
|
||||||
|
fuzzy = true;
|
||||||
|
insideBlock = true;
|
||||||
|
end = document.Paragraphs[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// The current line is not a prescription line:
|
||||||
|
// If we are currently in a definitive block of prescriptions,
|
||||||
|
// mark the line below the current line as the start of the block.
|
||||||
|
// If we're in a putative block, discard the information
|
||||||
|
// about the bottom end of the block and reset all flags.
|
||||||
|
if (insideBlock)
|
||||||
|
{
|
||||||
|
if (!fuzzy)
|
||||||
|
{
|
||||||
|
start = document.Paragraphs[i + 1];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fuzzy = false;
|
||||||
|
insideBlock = false;
|
||||||
|
end = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (end != null)
|
||||||
|
{
|
||||||
|
// If we don't have a start paragraph,
|
||||||
|
// but do have an end paragraph, we set the start paragraph to the
|
||||||
|
// first paragraph of the document.
|
||||||
|
if (start == null)
|
||||||
|
{
|
||||||
|
start = document.Paragraphs[1];
|
||||||
|
}
|
||||||
|
document.Range(start.Range.Start, end.Range.End).Select();
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Properties
|
||||||
|
|
||||||
|
public List<Prescription> Prescriptions { get; protected set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Constructor
|
||||||
|
|
||||||
|
public Importer() { }
|
||||||
|
|
||||||
|
public Importer(string text)
|
||||||
|
: this()
|
||||||
|
{
|
||||||
|
Import(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Private methods
|
||||||
|
|
||||||
|
protected virtual void Import(string text)
|
||||||
|
{
|
||||||
|
List<Prescription> list = new List<Prescription>();
|
||||||
|
IList<Prescription> addition;
|
||||||
|
int columns = 1;
|
||||||
|
string[] lines = Helpers.SplitParagraphs(text);
|
||||||
|
foreach (string line in lines)
|
||||||
|
{
|
||||||
|
if (Prescription.IsCanonicalPrescriptionLine(line))
|
||||||
|
{
|
||||||
|
addition = Prescription.ManyFromLine(line);
|
||||||
|
columns = System.Math.Max(columns, addition.Count);
|
||||||
|
list.AddRange(addition);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the input had several columns, sort the prescriptions by
|
||||||
|
// column.
|
||||||
|
// TODO: Make this more generic so it works with 3 or 4 columns as well.
|
||||||
|
if (columns == 2)
|
||||||
|
{
|
||||||
|
var firstCol = list.Where((item, index) => index % 2 == 0);
|
||||||
|
var secondCol = list.Where((item, index) => index % 2 != 0);
|
||||||
|
Prescriptions = firstCol.Concat(secondCol).ToList();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Prescriptions = list;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
267
zaaReloaded2/Medication/Prescription.cs
Executable file
267
zaaReloaded2/Medication/Prescription.cs
Executable file
@ -0,0 +1,267 @@
|
|||||||
|
/* Prescription.cs
|
||||||
|
* part of zaaReloaded2
|
||||||
|
*
|
||||||
|
* Copyright 2015 Daniel Kraus
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
|
namespace zaaReloaded2.Medication
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents a prescription
|
||||||
|
/// </summary>
|
||||||
|
public class Prescription
|
||||||
|
{
|
||||||
|
#region Static methods
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determines whether a line contains prescriptions.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="line">Line to inspect.</param>
|
||||||
|
/// <returns>True if the line contains prescriptions.</returns>
|
||||||
|
public static bool IsCanonicalPrescriptionLine(string line)
|
||||||
|
{
|
||||||
|
return canonicalRegex.IsMatch(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsPotentialPrescriptionLine(string line)
|
||||||
|
{
|
||||||
|
return alternativeRegex.IsMatch(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Factory
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a new Prescription object by parsing a line (e.g.,
|
||||||
|
/// from a physician's letter).
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="line">Line to parse</param>
|
||||||
|
/// <returns>Prescription created from the <paramref name="Line"/></returns>
|
||||||
|
public static Prescription FromLine(string line)
|
||||||
|
{
|
||||||
|
// Replace any runs of whitespace with a single space
|
||||||
|
// (from http://stackoverflow.com/a/206946/270712)
|
||||||
|
// line = Regex.Replace(line, @"\s+", " ");
|
||||||
|
Match m = unifiedRegex.Match(line);
|
||||||
|
int n = m.Groups[DOSE_GROUP].Captures.Count;
|
||||||
|
|
||||||
|
return new Prescription(
|
||||||
|
spaceRegex.Replace(m.Groups["drug"].Value, " "),
|
||||||
|
n > 0 ? m.Groups[DOSE_GROUP].Captures[0].Value : String.Empty,
|
||||||
|
n > 1 ? m.Groups[DOSE_GROUP].Captures[1].Value : String.Empty,
|
||||||
|
n > 2 ? m.Groups[DOSE_GROUP].Captures[2].Value : String.Empty,
|
||||||
|
n > 3 ? m.Groups[DOSE_GROUP].Captures[3].Value : String.Empty,
|
||||||
|
m.Groups["comment"].Value
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Extracts several prescriptions from a given line.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="line">Line that contains several prescriptions.</param>
|
||||||
|
/// <returns>Enumerable with <see cref="Prescription"/>s.</returns>
|
||||||
|
public static IList<Prescription> ManyFromLine(string line)
|
||||||
|
{
|
||||||
|
// line = Regex.Replace(line, @"\s+", " ");
|
||||||
|
MatchCollection mc = unifiedRegex.Matches(line);
|
||||||
|
List<Prescription> list = new List<Prescription>();
|
||||||
|
foreach (Match m in mc)
|
||||||
|
{
|
||||||
|
int n = m.Groups[DOSE_GROUP].Captures.Count;
|
||||||
|
list.Add(new Prescription(
|
||||||
|
spaceRegex.Replace(m.Groups["drug"].Value, " "),
|
||||||
|
n > 0 ? m.Groups[DOSE_GROUP].Captures[0].Value : String.Empty,
|
||||||
|
n > 1 ? m.Groups[DOSE_GROUP].Captures[1].Value : String.Empty,
|
||||||
|
n > 2 ? m.Groups[DOSE_GROUP].Captures[2].Value : String.Empty,
|
||||||
|
n > 3 ? m.Groups[DOSE_GROUP].Captures[3].Value : String.Empty,
|
||||||
|
m.Groups["comment"].Value
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Properties
|
||||||
|
|
||||||
|
public string Drug { get; set; }
|
||||||
|
|
||||||
|
public string Morning { get; set; }
|
||||||
|
|
||||||
|
public string Noon { get; set; }
|
||||||
|
|
||||||
|
public string Evening { get; set; }
|
||||||
|
|
||||||
|
public string Night { get; set; }
|
||||||
|
|
||||||
|
public string Comment { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determines whether the drug is MMF or a derivative.
|
||||||
|
/// </summary>
|
||||||
|
public bool IsMmf
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
string d = Drug.ToLower();
|
||||||
|
return
|
||||||
|
d.StartsWith("mmf") ||
|
||||||
|
d.StartsWith("cellcept") ||
|
||||||
|
d.StartsWith("cell cept") ||
|
||||||
|
d.StartsWith("myfortic") ||
|
||||||
|
d.StartsWith("mycophenol");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Overrides
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
string s = Drug + "\t";
|
||||||
|
if (!String.IsNullOrEmpty(Morning))
|
||||||
|
{
|
||||||
|
s += Morning;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!(String.IsNullOrEmpty(Noon) && String.IsNullOrEmpty(Evening) &&
|
||||||
|
String.IsNullOrEmpty(Night)))
|
||||||
|
{
|
||||||
|
s += "0";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!String.IsNullOrEmpty(Noon))
|
||||||
|
{
|
||||||
|
s += "-" + Noon;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!(String.IsNullOrEmpty(Evening) && String.IsNullOrEmpty(Night)))
|
||||||
|
{
|
||||||
|
s += "-0";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!String.IsNullOrEmpty(Evening))
|
||||||
|
{
|
||||||
|
s += "-" + Evening;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!String.IsNullOrEmpty(Night))
|
||||||
|
{
|
||||||
|
s += "-0";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!String.IsNullOrEmpty(Night))
|
||||||
|
{
|
||||||
|
s += "-" + Night;
|
||||||
|
}
|
||||||
|
if (!String.IsNullOrEmpty(Comment))
|
||||||
|
{
|
||||||
|
if (!s.EndsWith("\t"))
|
||||||
|
{
|
||||||
|
s += " ";
|
||||||
|
}
|
||||||
|
s += Comment;
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Constructors
|
||||||
|
|
||||||
|
public Prescription() { }
|
||||||
|
|
||||||
|
public Prescription(string drug)
|
||||||
|
: this()
|
||||||
|
{
|
||||||
|
Drug = drug.Trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Prescription(string drug, string morning, string noon,
|
||||||
|
string evening, string night)
|
||||||
|
: this(drug)
|
||||||
|
{
|
||||||
|
Morning = morning.Trim();
|
||||||
|
Noon = noon.Trim();
|
||||||
|
Evening = evening.Trim();
|
||||||
|
Night = night.Trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Prescription(string drug, string morning, string noon,
|
||||||
|
string evening, string night, string comment)
|
||||||
|
: this(drug, morning, noon, evening, night)
|
||||||
|
{
|
||||||
|
Comment = comment.Trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Fields
|
||||||
|
|
||||||
|
private const string DOSE_GROUP = "dose";
|
||||||
|
private const string DOSE = @"(\d\s+1/[234]|(\d\s?)?[\u00bd\u2153\u00bc]|\d+)";
|
||||||
|
private const string SPACER = @"(\s*[-\u2012\u2013\u2014]+\s*)";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The 'canonical' regex matches a prescription the form "Ramipril 5 mg 1-0-0"
|
||||||
|
/// with or without trailing comment.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Enclose entire regular expression in parentheses so we can use it
|
||||||
|
/// with or without trailing comment.
|
||||||
|
/// </remarks>
|
||||||
|
private const string canonicalPattern =
|
||||||
|
@"((?<drug>[^\t]+)\s+" +
|
||||||
|
@"(?<dose>" + DOSE + @")" + SPACER +
|
||||||
|
@"(?<dose>" + DOSE + @")" + SPACER +
|
||||||
|
@"(?<dose>" + DOSE + @")" +
|
||||||
|
@"(" + SPACER + @"(?<dose>" + DOSE + @"))?" +
|
||||||
|
@"( +(?<comment>[^\t]+))?\s*)";
|
||||||
|
private static readonly Regex canonicalRegex = new Regex(canonicalPattern);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The 'alternative' regex matches prescriptions that do not contain regular
|
||||||
|
/// dosing intervals ("1-0-0"), but free-style comments: "Cotrim forte alle 2 Tage".
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Because this alternative pattern matches other lines as well (e.g. with
|
||||||
|
/// signature names), it requires special handling.
|
||||||
|
/// </remarks>
|
||||||
|
private const string alternativePattern =
|
||||||
|
@"((?<drug>[^\t]+)( +|\t+)(?<comment>[^\t]+))";
|
||||||
|
private static readonly Regex alternativeRegex = new Regex(alternativePattern);
|
||||||
|
|
||||||
|
private static readonly Regex unifiedRegex = new Regex(
|
||||||
|
"(" + canonicalPattern + "|" + alternativePattern + ")");
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A 'cached', reusable regex to match several whitespace characters.
|
||||||
|
/// </summary>
|
||||||
|
private static readonly Regex spaceRegex = new Regex(@"\s+");
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
9
zaaReloaded2/Properties/Settings.Designer.cs
generated
9
zaaReloaded2/Properties/Settings.Designer.cs
generated
@ -276,5 +276,14 @@ namespace zaaReloaded2.Properties {
|
|||||||
this["NeedUpgrade"] = value;
|
this["NeedUpgrade"] = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.ApplicationScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("zaaReloaded2-Medikamente")]
|
||||||
|
public string DrugsParagraph {
|
||||||
|
get {
|
||||||
|
return ((string)(this["DrugsParagraph"]));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -80,5 +80,8 @@
|
|||||||
<Setting Name="NeedUpgrade" Type="System.Boolean" Scope="User">
|
<Setting Name="NeedUpgrade" Type="System.Boolean" Scope="User">
|
||||||
<Value Profile="(Default)">True</Value>
|
<Value Profile="(Default)">True</Value>
|
||||||
</Setting>
|
</Setting>
|
||||||
|
<Setting Name="DrugsParagraph" Type="System.String" Scope="Application">
|
||||||
|
<Value Profile="(Default)">zaaReloaded2-Medikamente</Value>
|
||||||
|
</Setting>
|
||||||
</Settings>
|
</Settings>
|
||||||
</SettingsFile>
|
</SettingsFile>
|
@ -87,7 +87,7 @@ namespace zaaReloaded2
|
|||||||
{
|
{
|
||||||
switch (control.Id)
|
switch (control.Id)
|
||||||
{
|
{
|
||||||
case "zrlFormat":
|
case "zrlFormatLab":
|
||||||
Commands.Format();
|
Commands.Format();
|
||||||
break;
|
break;
|
||||||
case "zrlSettings":
|
case "zrlSettings":
|
||||||
@ -105,6 +105,12 @@ namespace zaaReloaded2
|
|||||||
case "zrlDemo":
|
case "zrlDemo":
|
||||||
Commands.LoadDemo();
|
Commands.LoadDemo();
|
||||||
break;
|
break;
|
||||||
|
case "zrlFormatDrugsOneCol":
|
||||||
|
Commands.FormatDrugs(1);
|
||||||
|
break;
|
||||||
|
case "zrlFormatDrugsTwoCol":
|
||||||
|
Commands.FormatDrugs(2);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw new InvalidOperationException("No operation defined for " + control.Id);
|
throw new InvalidOperationException("No operation defined for " + control.Id);
|
||||||
}
|
}
|
||||||
@ -150,6 +156,11 @@ namespace zaaReloaded2
|
|||||||
return Commands.CanFormat();
|
return Commands.CanFormat();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool CanFormatDrugs(Office.IRibbonControl control)
|
||||||
|
{
|
||||||
|
return Commands.CanFormat();
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Public methods
|
#region Public methods
|
||||||
|
@ -23,12 +23,22 @@
|
|||||||
<ribbon>
|
<ribbon>
|
||||||
<tabs>
|
<tabs>
|
||||||
<tab id="zaaReloaded2" label="zaaReloaded2">
|
<tab id="zaaReloaded2" label="zaaReloaded2">
|
||||||
<group id="zrlFormatGroup" label="Formatieren">
|
<group id="zrlGroupLab" label="Laborwerte">
|
||||||
<button id="zrlFormat" label="Formatieren" image="f.png" onAction="Ribbon_Click" size="large"
|
<button id="zrlFormatLab" label="Formatieren" image="f.png" onAction="Ribbon_Click" size="large"
|
||||||
supertip="Formatiert den ausgewählten Bereich mit dem zuletzt verwendeten Stil."
|
supertip="Formatiert den ausgewählten Bereich mit dem zuletzt verwendeten Stil."
|
||||||
getEnabled="CanFormat" />
|
getEnabled="CanFormat" />
|
||||||
<button id="zrlSettings" label="Stilauswahl" image="fff.png" onAction="Ribbon_Click" size="large"
|
<button id="zrlSettings" label="Stilauswahl" image="fff.png" onAction="Ribbon_Click" size="large"
|
||||||
supertip="Zeigt eine Liste vorhandener Stile an. Stile können bearbeitet, hinzugefügt, gelöscht werden." />
|
supertip="Zeigt eine Liste vorhandener Stile an. Stile können bearbeitet, hinzugefügt, gelöscht werden." />
|
||||||
|
</group>
|
||||||
|
<group id="zrlGroupDrugs" label="Medikamente">
|
||||||
|
<button id="zrlFormatDrugsOneCol" label="Einspaltig" image="m.png" onAction="Ribbon_Click" size="large"
|
||||||
|
supertip="Formatiert die Medikationsliste einspaltig"
|
||||||
|
getEnabled="CanFormatDrugs" />
|
||||||
|
<button id="zrlFormatDrugsTwoCol" label="Zweispaltig" image="mm.png" onAction="Ribbon_Click" size="large"
|
||||||
|
supertip="Formatiert die Medikationsliste zweispaltig"
|
||||||
|
getEnabled="CanFormatDrugs" />
|
||||||
|
</group>
|
||||||
|
<group id="zrlSpecial" label="Spezial">
|
||||||
<button id="zrlDaniel" label="Daniels Spezial" image="dk.png" onAction="Ribbon_Click" size="large"
|
<button id="zrlDaniel" label="Daniels Spezial" image="dk.png" onAction="Ribbon_Click" size="large"
|
||||||
getVisible="Daniel_GetVisible"/>
|
getVisible="Daniel_GetVisible"/>
|
||||||
</group>
|
</group>
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
2.1.13
|
2.2.0
|
||||||
2.1.13.0
|
2.2.0.0
|
||||||
|
@ -86,6 +86,9 @@
|
|||||||
<setting name="Repository" serializeAs="String">
|
<setting name="Repository" serializeAs="String">
|
||||||
<value>http://git.bovender.de</value>
|
<value>http://git.bovender.de</value>
|
||||||
</setting>
|
</setting>
|
||||||
|
<setting name="DrugsParagraph" serializeAs="String">
|
||||||
|
<value>zaaReloaded2-Medikamente</value>
|
||||||
|
</setting>
|
||||||
</zaaReloaded2.Properties.Settings>
|
</zaaReloaded2.Properties.Settings>
|
||||||
</applicationSettings>
|
</applicationSettings>
|
||||||
<userSettings>
|
<userSettings>
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
<AssemblyName>zaaReloaded2</AssemblyName>
|
<AssemblyName>zaaReloaded2</AssemblyName>
|
||||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||||
<DefineConstants>VSTO40</DefineConstants>
|
<DefineConstants>VSTO40</DefineConstants>
|
||||||
|
<IsWebBootstrapper>False</IsWebBootstrapper>
|
||||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||||
<PublishUrl>publish\</PublishUrl>
|
<PublishUrl>publish\</PublishUrl>
|
||||||
<InstallUrl />
|
<InstallUrl />
|
||||||
@ -38,7 +39,6 @@
|
|||||||
<UpdateEnabled>true</UpdateEnabled>
|
<UpdateEnabled>true</UpdateEnabled>
|
||||||
<UpdateInterval>7</UpdateInterval>
|
<UpdateInterval>7</UpdateInterval>
|
||||||
<UpdateIntervalUnits>days</UpdateIntervalUnits>
|
<UpdateIntervalUnits>days</UpdateIntervalUnits>
|
||||||
<IsWebBootstrapper>False</IsWebBootstrapper>
|
|
||||||
<ProductName>zaaReloaded2</ProductName>
|
<ProductName>zaaReloaded2</ProductName>
|
||||||
<PublisherName />
|
<PublisherName />
|
||||||
<SupportUrl />
|
<SupportUrl />
|
||||||
@ -194,6 +194,7 @@
|
|||||||
-->
|
-->
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Commands.cs" />
|
<Compile Include="Commands.cs" />
|
||||||
|
<Compile Include="Helpers.cs" />
|
||||||
<Compile Include="Importer\ZaaImporter\AutoDetect.cs" />
|
<Compile Include="Importer\ZaaImporter\AutoDetect.cs" />
|
||||||
<Compile Include="Controller\Comments\CommentPool.cs" />
|
<Compile Include="Controller\Comments\CommentPool.cs" />
|
||||||
<Compile Include="Controller\Elements\ControlElementBase.cs" />
|
<Compile Include="Controller\Elements\ControlElementBase.cs" />
|
||||||
@ -221,6 +222,9 @@
|
|||||||
<Compile Include="Formatter\DanielsStyle.cs" />
|
<Compile Include="Formatter\DanielsStyle.cs" />
|
||||||
<Compile Include="Formatter\DocumentWriter.cs" />
|
<Compile Include="Formatter\DocumentWriter.cs" />
|
||||||
<Compile Include="Formatter\NoLaboratoryDataException.cs" />
|
<Compile Include="Formatter\NoLaboratoryDataException.cs" />
|
||||||
|
<Compile Include="Medication\Formatter.cs" />
|
||||||
|
<Compile Include="Medication\Importer.cs" />
|
||||||
|
<Compile Include="Medication\Prescription.cs" />
|
||||||
<Compile Include="Preferences.cs" />
|
<Compile Include="Preferences.cs" />
|
||||||
<Compile Include="Ribbon.cs" />
|
<Compile Include="Ribbon.cs" />
|
||||||
<Compile Include="Thesaurus\ThesaurusBase.cs" />
|
<Compile Include="Thesaurus\ThesaurusBase.cs" />
|
||||||
@ -446,6 +450,12 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Resource Include="Icons\gear.png" />
|
<Resource Include="Icons\gear.png" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Resource Include="Icons\m.png" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Resource Include="Icons\mm.png" />
|
||||||
|
</ItemGroup>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
|
||||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||||
|
Loading…
Reference in New Issue
Block a user