hayun-vite 0.0.3 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/styles-test.css +90 -90
- package/assets/styles.css +90 -90
- package/data/formData1.js +42 -42
- package/data/officesObjStore.js +56 -56
- package/data/patientsObjStore.js +73 -73
- package/data/sampleData.js +94 -94
- package/index.js +11 -11
- package/package.json +1 -1
- package/src/Audiogram/Audiogram.js +194 -197
- package/src/Audiogram/dims.js +83 -83
- package/src/Form/Form.js +268 -276
- package/src/Form/Form_N.js +158 -158
- package/src/Form/Forms-Test.html +124 -124
- package/src/Form/Forms.js +121 -134
- package/src/Form/Header.js +91 -91
- package/src/Form/Reflex.js +141 -141
- package/src/Form/Sections.js +71 -71
- package/src/Form/Speech.js +132 -132
- package/src/Form/TextBox.js +66 -82
- package/src/Form/Tympanogram.js +355 -355
- package/src/Form/formStyles.css +122 -122
- package/src/Form/globalinfo.js +68 -68
- package/src/Form/grid/drawGrid.js +84 -84
- package/src/Form/grid/hideGrid.js +8 -8
- package/src/Form/printForm.js +122 -75
- package/src/Form/templates/combo.js +248 -248
- package/src/Form/templates/dims.js +204 -204
- package/src/Form/templates/rasaAud.js +287 -287
- package/src/Symbol/Symbols.js +29 -29
- package/src/Symbol/createSymbolSVG.js +240 -240
- package/src/Symbol/getAllSymbolsSVG.js +21 -21
- package/src/Symbol/insertSymbol.js +10 -10
- package/src/Symbol/symbolChart.js +47 -47
- package/src/common/putLine.js +16 -16
- package/src/common/putPoint.js +12 -12
- package/src/common/putRect.js +13 -13
- package/src/common/putText.js +17 -16
- package/src/common/putTopLayer.js +17 -17
- package/src/main.js +88 -87
- package/src/note.css +62 -0
- package/src/style.css +189 -156
- package/src/note.html +0 -1
package/src/Form/Tympanogram.js
CHANGED
@@ -1,356 +1,356 @@
|
|
1
|
-
import putRect from "../common/putRect.js";
|
2
|
-
import putText from "../common/putText.js";
|
3
|
-
const svgNS = "http://www.w3.org/2000/svg";
|
4
|
-
|
5
|
-
export default class Tympanogram {
|
6
|
-
constructor({ container } = {}) {
|
7
|
-
this.pressure = { min: -600, max: +400, step: 200 };
|
8
|
-
this.compliance = { min: -0.50, max: 3, step: 0.50 };
|
9
|
-
this.padding = { right: 5, left: 8, top: 7, bottom: 14 };
|
10
|
-
this.container = container;
|
11
|
-
}
|
12
|
-
|
13
|
-
draw({ dims }) {
|
14
|
-
let width = dims.width;
|
15
|
-
let height = dims.height;
|
16
|
-
let x = dims.margin.left;
|
17
|
-
let y = dims.margin.top;
|
18
|
-
// const labels = items.labels;
|
19
|
-
|
20
|
-
const { pressure, compliance, padding } = {
|
21
|
-
pressure: this.pressure,
|
22
|
-
compliance: this.compliance,
|
23
|
-
padding: this.padding,
|
24
|
-
|
25
|
-
};
|
26
|
-
const svg = document.createElementNS(svgNS, "svg");
|
27
|
-
svg.setAttribute("data-name", "R_Tymp");
|
28
|
-
svg.setAttribute("width", width);
|
29
|
-
svg.setAttribute("height", height);
|
30
|
-
svg.setAttribute("x", x);
|
31
|
-
svg.setAttribute("y", y);
|
32
|
-
svg.setAttribute("viewBox", [-padding.left, -padding.top, width, height]);
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
const pressureAxiosLength = {
|
37
|
-
dapa: pressure.max - pressure.min,
|
38
|
-
mm: width - padding.left - padding.right
|
39
|
-
}
|
40
|
-
|
41
|
-
const complianceAxiosLength = {
|
42
|
-
ml: compliance.max - compliance.min,
|
43
|
-
mm: height - padding.top - padding.bottom
|
44
|
-
}
|
45
|
-
|
46
|
-
this.chartInfo = { pressure, compliance, padding, pressureAxiosLength, complianceAxiosLength };
|
47
|
-
|
48
|
-
// point({ this.container: svg, x: getX(pressure.min), y: getY(compliance.max), color: 'red' });
|
49
|
-
// point({ this.container: svg, x: getX(pressure.max), y: getY(compliance.min), color: 'green' });
|
50
|
-
// point({ this.container: svg, x: getX(pressure.min), y: getY(compliance.min), color: 'brown' });
|
51
|
-
let style;
|
52
|
-
// Pressure Axios (Horizontal)
|
53
|
-
style = `
|
54
|
-
stroke-width: 0.15mm;
|
55
|
-
stroke: black;
|
56
|
-
`;
|
57
|
-
putLine({
|
58
|
-
x1: getX(pressure.min), y1: getY(compliance.min),
|
59
|
-
x2: getX(pressure.max), y2: getY(compliance.min), style: style
|
60
|
-
})
|
61
|
-
// Compliance Axios (Vertical)
|
62
|
-
putLine({
|
63
|
-
x1: getX(pressure.min), y1: getY(compliance.min),
|
64
|
-
x2: getX(pressure.min), y2: getY(compliance.max), style: style
|
65
|
-
})
|
66
|
-
// Pressure Zero Line
|
67
|
-
style = `
|
68
|
-
stroke-width: 0.07mm;
|
69
|
-
stroke: black;
|
70
|
-
stroke-dasharray: 0.4;
|
71
|
-
stroke-opacity: 0.5;
|
72
|
-
`;
|
73
|
-
putLine({
|
74
|
-
x1: getX(0), y1: getY(compliance.min),
|
75
|
-
x2: getX(0), y2: getY(compliance.max), style: style
|
76
|
-
})
|
77
|
-
// Compliance Zero Line
|
78
|
-
putLine({
|
79
|
-
x1: getX(pressure.min), y1: getY(0),
|
80
|
-
x2: getX(pressure.max), y2: getY(0), style: style
|
81
|
-
})
|
82
|
-
|
83
|
-
// Captions:
|
84
|
-
style = `
|
85
|
-
user-select: none;
|
86
|
-
direction: ltr !important;
|
87
|
-
/* text-align: center; */
|
88
|
-
font-family: Arial, Helvetica, sans-serif !important;
|
89
|
-
font-size: 0.8mm;
|
90
|
-
text-anchor: middle; /*تراز افقی*/
|
91
|
-
dominant-baseline: middle; /* تراز عمودی*/
|
92
|
-
`;
|
93
|
-
putText({
|
94
|
-
container: svg, value: "Compliance (ml)", style: style,
|
95
|
-
x: getX(pressure.min), y: getY(compliance.max), dx: 5, dy: -3
|
96
|
-
});
|
97
|
-
putText({
|
98
|
-
container: svg, value: "Pressure (dapa)", style: style,
|
99
|
-
x: getX(pressure.max), y: getY(compliance.min), dx: -8, dy: 6,
|
100
|
-
});
|
101
|
-
style = `
|
102
|
-
user-select: none;
|
103
|
-
direction: ltr !important;
|
104
|
-
/* text-align: center; */
|
105
|
-
font-family: Arial, Helvetica, sans-serif !important;
|
106
|
-
font-size: 0.8mm;
|
107
|
-
text-anchor: start; /*تراز افقی*/
|
108
|
-
dominant-baseline: middle; /* تراز عمودی*/
|
109
|
-
`;
|
110
|
-
putText({
|
111
|
-
container: svg, value: "ECV :", style: style,
|
112
|
-
x: getX(pressure.min), y: getY(compliance.min), dy: 10
|
113
|
-
});
|
114
|
-
putText({
|
115
|
-
container: svg, value: "", style: style, name: 'ECV',
|
116
|
-
x: getX(pressure.min), y: getY(compliance.min), dy: 10, dx: 9
|
117
|
-
});
|
118
|
-
putText({
|
119
|
-
container: svg, value: "MEP :", style: style,
|
120
|
-
x: getX(-300), y: getY(compliance.min), dy: 10
|
121
|
-
});
|
122
|
-
putText({
|
123
|
-
container: svg, value: "", style: style, name: 'MEP',
|
124
|
-
x: getX(-300), y: getY(compliance.min), dy: 10, dx: 9
|
125
|
-
});
|
126
|
-
putText({
|
127
|
-
container: svg, value: "SC:", style: style,
|
128
|
-
x: getX(0), y: getY(compliance.min), dy: 10
|
129
|
-
});
|
130
|
-
putText({
|
131
|
-
container: svg, value: "", style: style, name: 'SC',
|
132
|
-
x: getX(0), y: getY(compliance.min), dy: 10, dx: 6
|
133
|
-
});
|
134
|
-
putText({
|
135
|
-
container: svg, value: "G:", style: style,
|
136
|
-
x: getX(300), y: getY(compliance.min), dy: 10
|
137
|
-
});
|
138
|
-
putText({
|
139
|
-
container: svg, value: "", style: style, name: 'G',
|
140
|
-
x: getX(300), y: getY(compliance.min), dy: 10, dx: 4
|
141
|
-
});
|
142
|
-
putText({
|
143
|
-
container: svg, value: "Type", style: style,
|
144
|
-
x: getX(-500), y: getY(2.5),
|
145
|
-
});
|
146
|
-
putText({
|
147
|
-
container: svg, value: "", style: style, name: 'Type',
|
148
|
-
x: getX(-500), y: getY(2.5), dx: 8
|
149
|
-
});
|
150
|
-
|
151
|
-
// Compliance Axios digits
|
152
|
-
style = `
|
153
|
-
user-select: none;
|
154
|
-
direction: ltr !important;
|
155
|
-
/* text-align: center; */
|
156
|
-
font-family: Arial, Helvetica, sans-serif !important;
|
157
|
-
font-size: 0.7mm;
|
158
|
-
text-anchor: end; /*تراز افقی*/
|
159
|
-
dominant-baseline: middle; /* تراز عمودی*/
|
160
|
-
|
161
|
-
`;
|
162
|
-
x = getX(pressure.min);
|
163
|
-
for (let c = compliance.min + compliance.step; c <= compliance.max; c += compliance.step) {
|
164
|
-
c = Math.round(c * 10) / 10 // برای اون پدیده اعشاری غیرمنتظر
|
165
|
-
putText({
|
166
|
-
container: svg, value: c,
|
167
|
-
x, y: getY(c), dx: -1,
|
168
|
-
style: style,
|
169
|
-
});
|
170
|
-
}
|
171
|
-
|
172
|
-
// Pressure Axios digits
|
173
|
-
style = `
|
174
|
-
user-select: none;
|
175
|
-
direction: ltr !important;
|
176
|
-
/* text-align: center; */
|
177
|
-
font-family: Arial, Helvetica, sans-serif !important;
|
178
|
-
font-size: 0.7mm;
|
179
|
-
text-anchor: middle; /*تراز افقی*/
|
180
|
-
dominant-baseline: hanging; /* تراز عمودی*/
|
181
|
-
`;
|
182
|
-
for (let p = pressure.min; p <= pressure.max; p += pressure.step) {
|
183
|
-
putText({
|
184
|
-
container: svg, value: p,
|
185
|
-
x: getX(p), y: getY(compliance.min), dy: 1,
|
186
|
-
style: style,
|
187
|
-
});
|
188
|
-
|
189
|
-
}
|
190
|
-
|
191
|
-
// console.log(this.container);
|
192
|
-
// مربع احاطهکننده کل جدول برای راهنمای توسعه
|
193
|
-
style = 'fill: transparent; stroke: green; stroke-width: 0.5;';
|
194
|
-
// یک بوردر راهنمای توسعه برای اس وی جی به تمام پهنا و ارتفاع رسم میکنیم
|
195
|
-
putRect({ container: svg, x: -padding.left, y: -padding.top, width, height, name: dims.name, style })
|
196
|
-
this.chart = svg;
|
197
|
-
this.container.appendChild(svg);
|
198
|
-
|
199
|
-
// بلاک توابع داخلی مورد نیاز تابع اصلی
|
200
|
-
// توابع تبدیل فشار و کامپلیانس به مختصات میلیمتر
|
201
|
-
function getX(p) {
|
202
|
-
return (p - pressure.min) * (pressureAxiosLength.mm / pressureAxiosLength.dapa)
|
203
|
-
}
|
204
|
-
|
205
|
-
function getY(c) {
|
206
|
-
return (compliance.max - c) * (complianceAxiosLength.mm / complianceAxiosLength.ml)
|
207
|
-
}
|
208
|
-
|
209
|
-
// تابع رسم خط
|
210
|
-
function putLine({ x1, y1, x2, y2, style }) {
|
211
|
-
|
212
|
-
let line = document.createElementNS(svgNS, "line");
|
213
|
-
line.setAttribute("x1", x1);
|
214
|
-
line.setAttribute("y1", y1);
|
215
|
-
line.setAttribute("x2", x2);
|
216
|
-
line.setAttribute("y2", y2);
|
217
|
-
line.setAttribute("style", style)
|
218
|
-
// line.setAttribute("stroke", "black");
|
219
|
-
// line.setAttribute("stroke-width", "0.1px");
|
220
|
-
svg.appendChild(line);
|
221
|
-
|
222
|
-
}
|
223
|
-
|
224
|
-
// تابع ایجاد و رسم نقطه نشانگر رنگی
|
225
|
-
function point({ container, x, y, color }) {
|
226
|
-
let circle = document.createElementNS(svgNS, "circle");
|
227
|
-
circle.setAttribute("cx", x);
|
228
|
-
circle.setAttribute("cy", y);
|
229
|
-
circle.setAttribute("r", '0.3mm');
|
230
|
-
circle.setAttribute("stroke", color);
|
231
|
-
container.appendChild(circle);
|
232
|
-
}
|
233
|
-
}
|
234
|
-
|
235
|
-
update(data) {
|
236
|
-
|
237
|
-
// جایگذاری مقادیر تمپانومتری در تکستباکس ها
|
238
|
-
this.chart.querySelector(`text[data-name="Type"]`).innerHTML = data?.type || "";
|
239
|
-
// container.getElementById(container.id + "_Type").innerHTML = data?.Type || "";
|
240
|
-
this.chart.querySelector(`text[data-name="ECV"]`).innerHTML = data?.ECV || "";
|
241
|
-
this.chart.querySelector(`text[data-name="MEP"]`).innerHTML = data?.MEP || "";
|
242
|
-
this.chart.querySelector(`text[data-name="SC"]`).innerHTML = data?.SC || "";
|
243
|
-
this.chart.querySelector(`text[data-name="G"]`).innerHTML = data?.G || "";
|
244
|
-
// container.getElementById(container.id + "_SC").innerHTML = data?.SC || "";
|
245
|
-
// document.getElementById(container + "_G").innerHTML = data.G;
|
246
|
-
// پاک کردن منحنی قبلی از کانتینر جاری
|
247
|
-
this.chart.querySelector(`path[data-name="curve"]`)?.remove();
|
248
|
-
// رسم منحنی
|
249
|
-
this.drawCurve(data);
|
250
|
-
|
251
|
-
}
|
252
|
-
|
253
|
-
// توابع داخلی
|
254
|
-
drawCurve(data) {
|
255
|
-
// Ensure to Convert to Numbers //
|
256
|
-
const container = this.chart
|
257
|
-
const { pressure, compliance, pressureAxiosLength, complianceAxiosLength } = this.chartInfo;
|
258
|
-
|
259
|
-
// تمرین پیدا کردن نقاط
|
260
|
-
point({ x: getX(-400), y: getY(5), color: 'green' })
|
261
|
-
|
262
|
-
// مقداردهی دستی برای تست شکل منحنی
|
263
|
-
// data.SC = 0.5;
|
264
|
-
// data.MEP = -75;
|
265
|
-
// با توجه به اندازه اس سی میشه برای مقادیر زیر یک سری رل گذاشت با منحنی قشنگ تر باشد
|
266
|
-
let cp = 50; // جابجایی نقطه کنترل منحنی های راست و چپ روی محور افقی
|
267
|
-
// let k = 0.5; // width and height change [0, 1]
|
268
|
-
let cpp = 5; //جابجایی نقطه کنترل قله ها روی محور افقی
|
269
|
-
// رلهایی برای تغییر مقادیر بالا برای زیبایی بیشتر منحنی در نقطه قله
|
270
|
-
// (data.SC <= 0.30)? k=0
|
271
|
-
let k = (+data.SC > 0.30) ? 0.5 : 0.1; // width and height change [0, 1]
|
272
|
-
k = (+data.SC > 1.0) ? 0.2 : k;
|
273
|
-
// k = (data.SC < 1.0) ? 0 : k;
|
274
|
-
|
275
|
-
let pw = 20 * k; // نصف پهنای قله
|
276
|
-
let ph = 0.1 * k; // ارتفاع قله
|
277
|
-
|
278
|
-
let zone = {
|
279
|
-
normal: { min: -300, max: 250 },
|
280
|
-
expanded: { min: -600, max: 400 },
|
281
|
-
}
|
282
|
-
// تعیین کرانههای منحنی بر حسب فشار گوش میانی
|
283
|
-
let RV = zone.normal;
|
284
|
-
if (+data.MEP > -250 && +data.MEP < 200) { RV = zone.normal } else { RV = zone.expanded }
|
285
|
-
|
286
|
-
|
287
|
-
const curve2 = {
|
288
|
-
R: {
|
289
|
-
P1: { p: RV.max, c: 0 },
|
290
|
-
P2: { p: +data.MEP + pw, c: +data.SC - ph },
|
291
|
-
C: { p: +data.MEP + cp, c: 0 }
|
292
|
-
},
|
293
|
-
RM: {
|
294
|
-
P2: { p: +data.MEP, c: +data.SC },
|
295
|
-
C: { p: +data.MEP + cpp, c: +data.SC }
|
296
|
-
},
|
297
|
-
LM: {
|
298
|
-
P2: { p: +data.MEP - pw, c: +data.SC - ph },
|
299
|
-
C: { p: +data.MEP - cpp, c: +data.SC }
|
300
|
-
},
|
301
|
-
L: {
|
302
|
-
P1: {},
|
303
|
-
P2: { p: RV.min, c: 0 },
|
304
|
-
C: { p: +data.MEP - cp, c: 0 }
|
305
|
-
}
|
306
|
-
}
|
307
|
-
|
308
|
-
// به دست آوردن مختصات نقاط کنترل بر حسب مختصات پیک
|
309
|
-
curve2.RM.P1 = curve2.R.P2
|
310
|
-
curve2.LM.P1 = curve2.RM.P2
|
311
|
-
curve2.L.P1 = curve2.LM.P2
|
312
|
-
let path = document.createElementNS(svgNS, "path");
|
313
|
-
path.setAttribute("fill", "none");
|
314
|
-
path.setAttribute("data-name", "curve");
|
315
|
-
let color = ("R" == "R") ? "brown" : "blue";
|
316
|
-
path.setAttribute("stroke", color);
|
317
|
-
path.setAttribute("stroke-width", "0.5px");
|
318
|
-
path.setAttribute(
|
319
|
-
"d", `
|
320
|
-
M ${ctg(curve2.R.P1)}
|
321
|
-
Q ${ctg(curve2.R.C)} ${ctg(curve2.R.P2)}
|
322
|
-
M ${ctg(curve2.RM.P1)}
|
323
|
-
Q ${ctg(curve2.RM.C)} ${ctg(curve2.RM.P2)}
|
324
|
-
M ${ctg(curve2.LM.P1)}
|
325
|
-
Q ${ctg(curve2.LM.C)} ${ctg(curve2.LM.P2)}
|
326
|
-
M ${ctg(curve2.L.P1)}
|
327
|
-
Q ${ctg(curve2.L.C)} ${ctg(curve2.L.P2)}
|
328
|
-
`
|
329
|
-
);
|
330
|
-
container.appendChild(path);
|
331
|
-
|
332
|
-
|
333
|
-
// تابع ایجاد و رسم نقطه نشانگر رنگی
|
334
|
-
function point({ x, y, color }) {
|
335
|
-
let circle = document.createElementNS(svgNS, "circle");
|
336
|
-
circle.setAttribute("cx", x);
|
337
|
-
circle.setAttribute("cy", y);
|
338
|
-
circle.setAttribute("r", 0.1);
|
339
|
-
circle.setAttribute("stroke", color);
|
340
|
-
container.appendChild(circle);
|
341
|
-
}
|
342
|
-
|
343
|
-
// تابعی که آبجکت مختصات را میگیرد و تبدیل به یک رشته با ترکیب دو عدد با ویرگول میکند
|
344
|
-
function ctg(pc) {
|
345
|
-
return `${getX(pc.p)} ${getY(pc.c)}`
|
346
|
-
}
|
347
|
-
|
348
|
-
function getX(p) {
|
349
|
-
return (p - pressure.min) * (pressureAxiosLength.mm / pressureAxiosLength.dapa)
|
350
|
-
}
|
351
|
-
|
352
|
-
function getY(c) {
|
353
|
-
return (compliance.max - c) * (complianceAxiosLength.mm / complianceAxiosLength.ml)
|
354
|
-
}
|
355
|
-
}
|
1
|
+
import putRect from "../common/putRect.js";
|
2
|
+
import putText from "../common/putText.js";
|
3
|
+
const svgNS = "http://www.w3.org/2000/svg";
|
4
|
+
|
5
|
+
export default class Tympanogram {
|
6
|
+
constructor({ container } = {}) {
|
7
|
+
this.pressure = { min: -600, max: +400, step: 200 };
|
8
|
+
this.compliance = { min: -0.50, max: 3, step: 0.50 };
|
9
|
+
this.padding = { right: 5, left: 8, top: 7, bottom: 14 };
|
10
|
+
this.container = container;
|
11
|
+
}
|
12
|
+
|
13
|
+
draw({ dims }) {
|
14
|
+
let width = dims.width;
|
15
|
+
let height = dims.height;
|
16
|
+
let x = dims.margin.left;
|
17
|
+
let y = dims.margin.top;
|
18
|
+
// const labels = items.labels;
|
19
|
+
|
20
|
+
const { pressure, compliance, padding } = {
|
21
|
+
pressure: this.pressure,
|
22
|
+
compliance: this.compliance,
|
23
|
+
padding: this.padding,
|
24
|
+
|
25
|
+
};
|
26
|
+
const svg = document.createElementNS(svgNS, "svg");
|
27
|
+
svg.setAttribute("data-name", "R_Tymp");
|
28
|
+
svg.setAttribute("width", width);
|
29
|
+
svg.setAttribute("height", height);
|
30
|
+
svg.setAttribute("x", x);
|
31
|
+
svg.setAttribute("y", y);
|
32
|
+
svg.setAttribute("viewBox", [-padding.left, -padding.top, width, height]);
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
const pressureAxiosLength = {
|
37
|
+
dapa: pressure.max - pressure.min,
|
38
|
+
mm: width - padding.left - padding.right
|
39
|
+
}
|
40
|
+
|
41
|
+
const complianceAxiosLength = {
|
42
|
+
ml: compliance.max - compliance.min,
|
43
|
+
mm: height - padding.top - padding.bottom
|
44
|
+
}
|
45
|
+
|
46
|
+
this.chartInfo = { pressure, compliance, padding, pressureAxiosLength, complianceAxiosLength };
|
47
|
+
|
48
|
+
// point({ this.container: svg, x: getX(pressure.min), y: getY(compliance.max), color: 'red' });
|
49
|
+
// point({ this.container: svg, x: getX(pressure.max), y: getY(compliance.min), color: 'green' });
|
50
|
+
// point({ this.container: svg, x: getX(pressure.min), y: getY(compliance.min), color: 'brown' });
|
51
|
+
let style;
|
52
|
+
// Pressure Axios (Horizontal)
|
53
|
+
style = `
|
54
|
+
stroke-width: 0.15mm;
|
55
|
+
stroke: black;
|
56
|
+
`;
|
57
|
+
putLine({
|
58
|
+
x1: getX(pressure.min), y1: getY(compliance.min),
|
59
|
+
x2: getX(pressure.max), y2: getY(compliance.min), style: style
|
60
|
+
})
|
61
|
+
// Compliance Axios (Vertical)
|
62
|
+
putLine({
|
63
|
+
x1: getX(pressure.min), y1: getY(compliance.min),
|
64
|
+
x2: getX(pressure.min), y2: getY(compliance.max), style: style
|
65
|
+
})
|
66
|
+
// Pressure Zero Line
|
67
|
+
style = `
|
68
|
+
stroke-width: 0.07mm;
|
69
|
+
stroke: black;
|
70
|
+
stroke-dasharray: 0.4;
|
71
|
+
stroke-opacity: 0.5;
|
72
|
+
`;
|
73
|
+
putLine({
|
74
|
+
x1: getX(0), y1: getY(compliance.min),
|
75
|
+
x2: getX(0), y2: getY(compliance.max), style: style
|
76
|
+
})
|
77
|
+
// Compliance Zero Line
|
78
|
+
putLine({
|
79
|
+
x1: getX(pressure.min), y1: getY(0),
|
80
|
+
x2: getX(pressure.max), y2: getY(0), style: style
|
81
|
+
})
|
82
|
+
|
83
|
+
// Captions:
|
84
|
+
style = `
|
85
|
+
user-select: none;
|
86
|
+
direction: ltr !important;
|
87
|
+
/* text-align: center; */
|
88
|
+
font-family: Arial, Helvetica, sans-serif !important;
|
89
|
+
font-size: 0.8mm;
|
90
|
+
text-anchor: middle; /*تراز افقی*/
|
91
|
+
dominant-baseline: middle; /* تراز عمودی*/
|
92
|
+
`;
|
93
|
+
putText({
|
94
|
+
container: svg, value: "Compliance (ml)", style: style,
|
95
|
+
x: getX(pressure.min), y: getY(compliance.max), dx: 5, dy: -3
|
96
|
+
});
|
97
|
+
putText({
|
98
|
+
container: svg, value: "Pressure (dapa)", style: style,
|
99
|
+
x: getX(pressure.max), y: getY(compliance.min), dx: -8, dy: 6,
|
100
|
+
});
|
101
|
+
style = `
|
102
|
+
user-select: none;
|
103
|
+
direction: ltr !important;
|
104
|
+
/* text-align: center; */
|
105
|
+
font-family: Arial, Helvetica, sans-serif !important;
|
106
|
+
font-size: 0.8mm;
|
107
|
+
text-anchor: start; /*تراز افقی*/
|
108
|
+
dominant-baseline: middle; /* تراز عمودی*/
|
109
|
+
`;
|
110
|
+
putText({
|
111
|
+
container: svg, value: "ECV :", style: style,
|
112
|
+
x: getX(pressure.min), y: getY(compliance.min), dy: 10
|
113
|
+
});
|
114
|
+
putText({
|
115
|
+
container: svg, value: "", style: style, name: 'ECV',
|
116
|
+
x: getX(pressure.min), y: getY(compliance.min), dy: 10, dx: 9
|
117
|
+
});
|
118
|
+
putText({
|
119
|
+
container: svg, value: "MEP :", style: style,
|
120
|
+
x: getX(-300), y: getY(compliance.min), dy: 10
|
121
|
+
});
|
122
|
+
putText({
|
123
|
+
container: svg, value: "", style: style, name: 'MEP',
|
124
|
+
x: getX(-300), y: getY(compliance.min), dy: 10, dx: 9
|
125
|
+
});
|
126
|
+
putText({
|
127
|
+
container: svg, value: "SC:", style: style,
|
128
|
+
x: getX(0), y: getY(compliance.min), dy: 10
|
129
|
+
});
|
130
|
+
putText({
|
131
|
+
container: svg, value: "", style: style, name: 'SC',
|
132
|
+
x: getX(0), y: getY(compliance.min), dy: 10, dx: 6
|
133
|
+
});
|
134
|
+
putText({
|
135
|
+
container: svg, value: "G:", style: style,
|
136
|
+
x: getX(300), y: getY(compliance.min), dy: 10
|
137
|
+
});
|
138
|
+
putText({
|
139
|
+
container: svg, value: "", style: style, name: 'G',
|
140
|
+
x: getX(300), y: getY(compliance.min), dy: 10, dx: 4
|
141
|
+
});
|
142
|
+
putText({
|
143
|
+
container: svg, value: "Type", style: style,
|
144
|
+
x: getX(-500), y: getY(2.5),
|
145
|
+
});
|
146
|
+
putText({
|
147
|
+
container: svg, value: "", style: style, name: 'Type',
|
148
|
+
x: getX(-500), y: getY(2.5), dx: 8
|
149
|
+
});
|
150
|
+
|
151
|
+
// Compliance Axios digits
|
152
|
+
style = `
|
153
|
+
user-select: none;
|
154
|
+
direction: ltr !important;
|
155
|
+
/* text-align: center; */
|
156
|
+
font-family: Arial, Helvetica, sans-serif !important;
|
157
|
+
font-size: 0.7mm;
|
158
|
+
text-anchor: end; /*تراز افقی*/
|
159
|
+
dominant-baseline: middle; /* تراز عمودی*/
|
160
|
+
|
161
|
+
`;
|
162
|
+
x = getX(pressure.min);
|
163
|
+
for (let c = compliance.min + compliance.step; c <= compliance.max; c += compliance.step) {
|
164
|
+
c = Math.round(c * 10) / 10 // برای اون پدیده اعشاری غیرمنتظر
|
165
|
+
putText({
|
166
|
+
container: svg, value: c,
|
167
|
+
x, y: getY(c), dx: -1,
|
168
|
+
style: style,
|
169
|
+
});
|
170
|
+
}
|
171
|
+
|
172
|
+
// Pressure Axios digits
|
173
|
+
style = `
|
174
|
+
user-select: none;
|
175
|
+
direction: ltr !important;
|
176
|
+
/* text-align: center; */
|
177
|
+
font-family: Arial, Helvetica, sans-serif !important;
|
178
|
+
font-size: 0.7mm;
|
179
|
+
text-anchor: middle; /*تراز افقی*/
|
180
|
+
dominant-baseline: hanging; /* تراز عمودی*/
|
181
|
+
`;
|
182
|
+
for (let p = pressure.min; p <= pressure.max; p += pressure.step) {
|
183
|
+
putText({
|
184
|
+
container: svg, value: p,
|
185
|
+
x: getX(p), y: getY(compliance.min), dy: 1,
|
186
|
+
style: style,
|
187
|
+
});
|
188
|
+
|
189
|
+
}
|
190
|
+
|
191
|
+
// console.log(this.container);
|
192
|
+
// مربع احاطهکننده کل جدول برای راهنمای توسعه
|
193
|
+
style = 'fill: transparent; stroke: green; stroke-width: 0.5;';
|
194
|
+
// یک بوردر راهنمای توسعه برای اس وی جی به تمام پهنا و ارتفاع رسم میکنیم
|
195
|
+
putRect({ container: svg, x: -padding.left, y: -padding.top, width, height, name: dims.name, style })
|
196
|
+
this.chart = svg;
|
197
|
+
this.container.appendChild(svg);
|
198
|
+
|
199
|
+
// بلاک توابع داخلی مورد نیاز تابع اصلی
|
200
|
+
// توابع تبدیل فشار و کامپلیانس به مختصات میلیمتر
|
201
|
+
function getX(p) {
|
202
|
+
return (p - pressure.min) * (pressureAxiosLength.mm / pressureAxiosLength.dapa)
|
203
|
+
}
|
204
|
+
|
205
|
+
function getY(c) {
|
206
|
+
return (compliance.max - c) * (complianceAxiosLength.mm / complianceAxiosLength.ml)
|
207
|
+
}
|
208
|
+
|
209
|
+
// تابع رسم خط
|
210
|
+
function putLine({ x1, y1, x2, y2, style }) {
|
211
|
+
|
212
|
+
let line = document.createElementNS(svgNS, "line");
|
213
|
+
line.setAttribute("x1", x1);
|
214
|
+
line.setAttribute("y1", y1);
|
215
|
+
line.setAttribute("x2", x2);
|
216
|
+
line.setAttribute("y2", y2);
|
217
|
+
line.setAttribute("style", style)
|
218
|
+
// line.setAttribute("stroke", "black");
|
219
|
+
// line.setAttribute("stroke-width", "0.1px");
|
220
|
+
svg.appendChild(line);
|
221
|
+
|
222
|
+
}
|
223
|
+
|
224
|
+
// تابع ایجاد و رسم نقطه نشانگر رنگی
|
225
|
+
function point({ container, x, y, color }) {
|
226
|
+
let circle = document.createElementNS(svgNS, "circle");
|
227
|
+
circle.setAttribute("cx", x);
|
228
|
+
circle.setAttribute("cy", y);
|
229
|
+
circle.setAttribute("r", '0.3mm');
|
230
|
+
circle.setAttribute("stroke", color);
|
231
|
+
container.appendChild(circle);
|
232
|
+
}
|
233
|
+
}
|
234
|
+
|
235
|
+
update(data) {
|
236
|
+
|
237
|
+
// جایگذاری مقادیر تمپانومتری در تکستباکس ها
|
238
|
+
this.chart.querySelector(`text[data-name="Type"]`).innerHTML = data?.type || "";
|
239
|
+
// container.getElementById(container.id + "_Type").innerHTML = data?.Type || "";
|
240
|
+
this.chart.querySelector(`text[data-name="ECV"]`).innerHTML = data?.ECV || "";
|
241
|
+
this.chart.querySelector(`text[data-name="MEP"]`).innerHTML = data?.MEP || "";
|
242
|
+
this.chart.querySelector(`text[data-name="SC"]`).innerHTML = data?.SC || "";
|
243
|
+
this.chart.querySelector(`text[data-name="G"]`).innerHTML = data?.G || "";
|
244
|
+
// container.getElementById(container.id + "_SC").innerHTML = data?.SC || "";
|
245
|
+
// document.getElementById(container + "_G").innerHTML = data.G;
|
246
|
+
// پاک کردن منحنی قبلی از کانتینر جاری
|
247
|
+
this.chart.querySelector(`path[data-name="curve"]`)?.remove();
|
248
|
+
// رسم منحنی
|
249
|
+
this.drawCurve(data);
|
250
|
+
|
251
|
+
}
|
252
|
+
|
253
|
+
// توابع داخلی
|
254
|
+
drawCurve(data) {
|
255
|
+
// Ensure to Convert to Numbers //
|
256
|
+
const container = this.chart
|
257
|
+
const { pressure, compliance, pressureAxiosLength, complianceAxiosLength } = this.chartInfo;
|
258
|
+
|
259
|
+
// تمرین پیدا کردن نقاط
|
260
|
+
point({ x: getX(-400), y: getY(5), color: 'green' })
|
261
|
+
|
262
|
+
// مقداردهی دستی برای تست شکل منحنی
|
263
|
+
// data.SC = 0.5;
|
264
|
+
// data.MEP = -75;
|
265
|
+
// با توجه به اندازه اس سی میشه برای مقادیر زیر یک سری رل گذاشت با منحنی قشنگ تر باشد
|
266
|
+
let cp = 50; // جابجایی نقطه کنترل منحنی های راست و چپ روی محور افقی
|
267
|
+
// let k = 0.5; // width and height change [0, 1]
|
268
|
+
let cpp = 5; //جابجایی نقطه کنترل قله ها روی محور افقی
|
269
|
+
// رلهایی برای تغییر مقادیر بالا برای زیبایی بیشتر منحنی در نقطه قله
|
270
|
+
// (data.SC <= 0.30)? k=0
|
271
|
+
let k = (+data.SC > 0.30) ? 0.5 : 0.1; // width and height change [0, 1]
|
272
|
+
k = (+data.SC > 1.0) ? 0.2 : k;
|
273
|
+
// k = (data.SC < 1.0) ? 0 : k;
|
274
|
+
|
275
|
+
let pw = 20 * k; // نصف پهنای قله
|
276
|
+
let ph = 0.1 * k; // ارتفاع قله
|
277
|
+
|
278
|
+
let zone = {
|
279
|
+
normal: { min: -300, max: 250 },
|
280
|
+
expanded: { min: -600, max: 400 },
|
281
|
+
}
|
282
|
+
// تعیین کرانههای منحنی بر حسب فشار گوش میانی
|
283
|
+
let RV = zone.normal;
|
284
|
+
if (+data.MEP > -250 && +data.MEP < 200) { RV = zone.normal } else { RV = zone.expanded }
|
285
|
+
|
286
|
+
|
287
|
+
const curve2 = {
|
288
|
+
R: {
|
289
|
+
P1: { p: RV.max, c: 0 },
|
290
|
+
P2: { p: +data.MEP + pw, c: +data.SC - ph },
|
291
|
+
C: { p: +data.MEP + cp, c: 0 }
|
292
|
+
},
|
293
|
+
RM: {
|
294
|
+
P2: { p: +data.MEP, c: +data.SC },
|
295
|
+
C: { p: +data.MEP + cpp, c: +data.SC }
|
296
|
+
},
|
297
|
+
LM: {
|
298
|
+
P2: { p: +data.MEP - pw, c: +data.SC - ph },
|
299
|
+
C: { p: +data.MEP - cpp, c: +data.SC }
|
300
|
+
},
|
301
|
+
L: {
|
302
|
+
P1: {},
|
303
|
+
P2: { p: RV.min, c: 0 },
|
304
|
+
C: { p: +data.MEP - cp, c: 0 }
|
305
|
+
}
|
306
|
+
}
|
307
|
+
|
308
|
+
// به دست آوردن مختصات نقاط کنترل بر حسب مختصات پیک
|
309
|
+
curve2.RM.P1 = curve2.R.P2
|
310
|
+
curve2.LM.P1 = curve2.RM.P2
|
311
|
+
curve2.L.P1 = curve2.LM.P2
|
312
|
+
let path = document.createElementNS(svgNS, "path");
|
313
|
+
path.setAttribute("fill", "none");
|
314
|
+
path.setAttribute("data-name", "curve");
|
315
|
+
let color = ("R" == "R") ? "brown" : "blue";
|
316
|
+
path.setAttribute("stroke", color);
|
317
|
+
path.setAttribute("stroke-width", "0.5px");
|
318
|
+
path.setAttribute(
|
319
|
+
"d", `
|
320
|
+
M ${ctg(curve2.R.P1)}
|
321
|
+
Q ${ctg(curve2.R.C)} ${ctg(curve2.R.P2)}
|
322
|
+
M ${ctg(curve2.RM.P1)}
|
323
|
+
Q ${ctg(curve2.RM.C)} ${ctg(curve2.RM.P2)}
|
324
|
+
M ${ctg(curve2.LM.P1)}
|
325
|
+
Q ${ctg(curve2.LM.C)} ${ctg(curve2.LM.P2)}
|
326
|
+
M ${ctg(curve2.L.P1)}
|
327
|
+
Q ${ctg(curve2.L.C)} ${ctg(curve2.L.P2)}
|
328
|
+
`
|
329
|
+
);
|
330
|
+
container.appendChild(path);
|
331
|
+
|
332
|
+
|
333
|
+
// تابع ایجاد و رسم نقطه نشانگر رنگی
|
334
|
+
function point({ x, y, color }) {
|
335
|
+
let circle = document.createElementNS(svgNS, "circle");
|
336
|
+
circle.setAttribute("cx", x);
|
337
|
+
circle.setAttribute("cy", y);
|
338
|
+
circle.setAttribute("r", 0.1);
|
339
|
+
circle.setAttribute("stroke", color);
|
340
|
+
container.appendChild(circle);
|
341
|
+
}
|
342
|
+
|
343
|
+
// تابعی که آبجکت مختصات را میگیرد و تبدیل به یک رشته با ترکیب دو عدد با ویرگول میکند
|
344
|
+
function ctg(pc) {
|
345
|
+
return `${getX(pc.p)} ${getY(pc.c)}`
|
346
|
+
}
|
347
|
+
|
348
|
+
function getX(p) {
|
349
|
+
return (p - pressure.min) * (pressureAxiosLength.mm / pressureAxiosLength.dapa)
|
350
|
+
}
|
351
|
+
|
352
|
+
function getY(c) {
|
353
|
+
return (compliance.max - c) * (complianceAxiosLength.mm / complianceAxiosLength.ml)
|
354
|
+
}
|
355
|
+
}
|
356
356
|
}
|