1# Copyright (c) 2010-2024 openpyxl
2
3
4from openpyxl.descriptors.serialisable import Serialisable
5from openpyxl.descriptors import (
6 Alias,
7 Typed,
8 Set,
9 NoneSet,
10 Sequence,
11 String,
12 Bool,
13 MinMax,
14 Integer
15)
16from openpyxl.descriptors.excel import (
17 HexBinary,
18 Coordinate,
19 Relation,
20)
21from openpyxl.descriptors.nested import (
22 NestedInteger,
23 NestedText,
24 NestedValue,
25 EmptyTag
26)
27from openpyxl.xml.constants import DRAWING_NS
28
29
30from .colors import ColorChoiceDescriptor
31from .effect import (
32 EffectList,
33 EffectContainer,
34)
35from .fill import(
36 GradientFillProperties,
37 BlipFillProperties,
38 PatternFillProperties,
39 Blip
40)
41from .geometry import (
42 LineProperties,
43 Color,
44 Scene3D
45)
46
47from openpyxl.descriptors.excel import ExtensionList as OfficeArtExtensionList
48from openpyxl.descriptors.nested import NestedBool
49
50
51class EmbeddedWAVAudioFile(Serialisable):
52
53 name = String(allow_none=True)
54
55 def __init__(self,
56 name=None,
57 ):
58 self.name = name
59
60
61class Hyperlink(Serialisable):
62
63 tagname = "hlinkClick"
64 namespace = DRAWING_NS
65
66 invalidUrl = String(allow_none=True)
67 action = String(allow_none=True)
68 tgtFrame = String(allow_none=True)
69 tooltip = String(allow_none=True)
70 history = Bool(allow_none=True)
71 highlightClick = Bool(allow_none=True)
72 endSnd = Bool(allow_none=True)
73 snd = Typed(expected_type=EmbeddedWAVAudioFile, allow_none=True)
74 extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True)
75 id = Relation(allow_none=True)
76
77 __elements__ = ('snd',)
78
79 def __init__(self,
80 invalidUrl=None,
81 action=None,
82 tgtFrame=None,
83 tooltip=None,
84 history=None,
85 highlightClick=None,
86 endSnd=None,
87 snd=None,
88 extLst=None,
89 id=None,
90 ):
91 self.invalidUrl = invalidUrl
92 self.action = action
93 self.tgtFrame = tgtFrame
94 self.tooltip = tooltip
95 self.history = history
96 self.highlightClick = highlightClick
97 self.endSnd = endSnd
98 self.snd = snd
99 self.id = id
100
101
102class Font(Serialisable):
103
104 tagname = "latin"
105 namespace = DRAWING_NS
106
107 typeface = String()
108 panose = HexBinary(allow_none=True)
109 pitchFamily = MinMax(min=0, max=52, allow_none=True)
110 charset = Integer(allow_none=True)
111
112 def __init__(self,
113 typeface=None,
114 panose=None,
115 pitchFamily=None,
116 charset=None,
117 ):
118 self.typeface = typeface
119 self.panose = panose
120 self.pitchFamily = pitchFamily
121 self.charset = charset
122
123
124class CharacterProperties(Serialisable):
125
126 tagname = "defRPr"
127 namespace = DRAWING_NS
128
129 kumimoji = Bool(allow_none=True)
130 lang = String(allow_none=True)
131 altLang = String(allow_none=True)
132 sz = MinMax(allow_none=True, min=100, max=400000) # 100ths of a point
133 b = Bool(allow_none=True)
134 i = Bool(allow_none=True)
135 u = NoneSet(values=(['words', 'sng', 'dbl', 'heavy', 'dotted',
136 'dottedHeavy', 'dash', 'dashHeavy', 'dashLong', 'dashLongHeavy',
137 'dotDash', 'dotDashHeavy', 'dotDotDash', 'dotDotDashHeavy', 'wavy',
138 'wavyHeavy', 'wavyDbl']))
139 strike = NoneSet(values=(['noStrike', 'sngStrike', 'dblStrike']))
140 kern = Integer(allow_none=True)
141 cap = NoneSet(values=(['small', 'all']))
142 spc = Integer(allow_none=True)
143 normalizeH = Bool(allow_none=True)
144 baseline = Integer(allow_none=True)
145 noProof = Bool(allow_none=True)
146 dirty = Bool(allow_none=True)
147 err = Bool(allow_none=True)
148 smtClean = Bool(allow_none=True)
149 smtId = Integer(allow_none=True)
150 bmk = String(allow_none=True)
151 ln = Typed(expected_type=LineProperties, allow_none=True)
152 highlight = Typed(expected_type=Color, allow_none=True)
153 latin = Typed(expected_type=Font, allow_none=True)
154 ea = Typed(expected_type=Font, allow_none=True)
155 cs = Typed(expected_type=Font, allow_none=True)
156 sym = Typed(expected_type=Font, allow_none=True)
157 hlinkClick = Typed(expected_type=Hyperlink, allow_none=True)
158 hlinkMouseOver = Typed(expected_type=Hyperlink, allow_none=True)
159 rtl = NestedBool(allow_none=True)
160 extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True)
161 # uses element group EG_FillProperties
162 noFill = EmptyTag(namespace=DRAWING_NS)
163 solidFill = ColorChoiceDescriptor()
164 gradFill = Typed(expected_type=GradientFillProperties, allow_none=True)
165 blipFill = Typed(expected_type=BlipFillProperties, allow_none=True)
166 pattFill = Typed(expected_type=PatternFillProperties, allow_none=True)
167 grpFill = EmptyTag(namespace=DRAWING_NS)
168 # uses element group EG_EffectProperties
169 effectLst = Typed(expected_type=EffectList, allow_none=True)
170 effectDag = Typed(expected_type=EffectContainer, allow_none=True)
171 # uses element group EG_TextUnderlineLine
172 uLnTx = EmptyTag()
173 uLn = Typed(expected_type=LineProperties, allow_none=True)
174 # uses element group EG_TextUnderlineFill
175 uFillTx = EmptyTag()
176 uFill = EmptyTag()
177
178 __elements__ = ('ln', 'noFill', 'solidFill', 'gradFill', 'blipFill',
179 'pattFill', 'grpFill', 'effectLst', 'effectDag', 'highlight','uLnTx',
180 'uLn', 'uFillTx', 'uFill', 'latin', 'ea', 'cs', 'sym', 'hlinkClick',
181 'hlinkMouseOver', 'rtl', )
182
183 def __init__(self,
184 kumimoji=None,
185 lang=None,
186 altLang=None,
187 sz=None,
188 b=None,
189 i=None,
190 u=None,
191 strike=None,
192 kern=None,
193 cap=None,
194 spc=None,
195 normalizeH=None,
196 baseline=None,
197 noProof=None,
198 dirty=None,
199 err=None,
200 smtClean=None,
201 smtId=None,
202 bmk=None,
203 ln=None,
204 highlight=None,
205 latin=None,
206 ea=None,
207 cs=None,
208 sym=None,
209 hlinkClick=None,
210 hlinkMouseOver=None,
211 rtl=None,
212 extLst=None,
213 noFill=None,
214 solidFill=None,
215 gradFill=None,
216 blipFill=None,
217 pattFill=None,
218 grpFill=None,
219 effectLst=None,
220 effectDag=None,
221 uLnTx=None,
222 uLn=None,
223 uFillTx=None,
224 uFill=None,
225 ):
226 self.kumimoji = kumimoji
227 self.lang = lang
228 self.altLang = altLang
229 self.sz = sz
230 self.b = b
231 self.i = i
232 self.u = u
233 self.strike = strike
234 self.kern = kern
235 self.cap = cap
236 self.spc = spc
237 self.normalizeH = normalizeH
238 self.baseline = baseline
239 self.noProof = noProof
240 self.dirty = dirty
241 self.err = err
242 self.smtClean = smtClean
243 self.smtId = smtId
244 self.bmk = bmk
245 self.ln = ln
246 self.highlight = highlight
247 self.latin = latin
248 self.ea = ea
249 self.cs = cs
250 self.sym = sym
251 self.hlinkClick = hlinkClick
252 self.hlinkMouseOver = hlinkMouseOver
253 self.rtl = rtl
254 self.noFill = noFill
255 self.solidFill = solidFill
256 self.gradFill = gradFill
257 self.blipFill = blipFill
258 self.pattFill = pattFill
259 self.grpFill = grpFill
260 self.effectLst = effectLst
261 self.effectDag = effectDag
262 self.uLnTx = uLnTx
263 self.uLn = uLn
264 self.uFillTx = uFillTx
265 self.uFill = uFill
266
267
268class TabStop(Serialisable):
269
270 pos = Typed(expected_type=Coordinate, allow_none=True)
271 algn = Typed(expected_type=Set(values=(['l', 'ctr', 'r', 'dec'])))
272
273 def __init__(self,
274 pos=None,
275 algn=None,
276 ):
277 self.pos = pos
278 self.algn = algn
279
280
281class TabStopList(Serialisable):
282
283 tab = Typed(expected_type=TabStop, allow_none=True)
284
285 def __init__(self,
286 tab=None,
287 ):
288 self.tab = tab
289
290
291class Spacing(Serialisable):
292
293 spcPct = NestedInteger(allow_none=True)
294 spcPts = NestedInteger(allow_none=True)
295
296 __elements__ = ('spcPct', 'spcPts')
297
298 def __init__(self,
299 spcPct=None,
300 spcPts=None,
301 ):
302 self.spcPct = spcPct
303 self.spcPts = spcPts
304
305
306class AutonumberBullet(Serialisable):
307
308 type = Set(values=(['alphaLcParenBoth', 'alphaUcParenBoth',
309 'alphaLcParenR', 'alphaUcParenR', 'alphaLcPeriod', 'alphaUcPeriod',
310 'arabicParenBoth', 'arabicParenR', 'arabicPeriod', 'arabicPlain',
311 'romanLcParenBoth', 'romanUcParenBoth', 'romanLcParenR', 'romanUcParenR',
312 'romanLcPeriod', 'romanUcPeriod', 'circleNumDbPlain',
313 'circleNumWdBlackPlain', 'circleNumWdWhitePlain', 'arabicDbPeriod',
314 'arabicDbPlain', 'ea1ChsPeriod', 'ea1ChsPlain', 'ea1ChtPeriod',
315 'ea1ChtPlain', 'ea1JpnChsDbPeriod', 'ea1JpnKorPlain', 'ea1JpnKorPeriod',
316 'arabic1Minus', 'arabic2Minus', 'hebrew2Minus', 'thaiAlphaPeriod',
317 'thaiAlphaParenR', 'thaiAlphaParenBoth', 'thaiNumPeriod',
318 'thaiNumParenR', 'thaiNumParenBoth', 'hindiAlphaPeriod',
319 'hindiNumPeriod', 'hindiNumParenR', 'hindiAlpha1Period']))
320 startAt = Integer()
321
322 def __init__(self,
323 type=None,
324 startAt=None,
325 ):
326 self.type = type
327 self.startAt = startAt
328
329
330class ParagraphProperties(Serialisable):
331
332 tagname = "pPr"
333 namespace = DRAWING_NS
334
335 marL = Integer(allow_none=True)
336 marR = Integer(allow_none=True)
337 lvl = Integer(allow_none=True)
338 indent = Integer(allow_none=True)
339 algn = NoneSet(values=(['l', 'ctr', 'r', 'just', 'justLow', 'dist', 'thaiDist']))
340 defTabSz = Integer(allow_none=True)
341 rtl = Bool(allow_none=True)
342 eaLnBrk = Bool(allow_none=True)
343 fontAlgn = NoneSet(values=(['auto', 't', 'ctr', 'base', 'b']))
344 latinLnBrk = Bool(allow_none=True)
345 hangingPunct = Bool(allow_none=True)
346
347 # uses element group EG_TextBulletColor
348 # uses element group EG_TextBulletSize
349 # uses element group EG_TextBulletTypeface
350 # uses element group EG_TextBullet
351 lnSpc = Typed(expected_type=Spacing, allow_none=True)
352 spcBef = Typed(expected_type=Spacing, allow_none=True)
353 spcAft = Typed(expected_type=Spacing, allow_none=True)
354 tabLst = Typed(expected_type=TabStopList, allow_none=True)
355 defRPr = Typed(expected_type=CharacterProperties, allow_none=True)
356 extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True)
357 buClrTx = EmptyTag()
358 buClr = Typed(expected_type=Color, allow_none=True)
359 buSzTx = EmptyTag()
360 buSzPct = NestedInteger(allow_none=True)
361 buSzPts = NestedInteger(allow_none=True)
362 buFontTx = EmptyTag()
363 buFont = Typed(expected_type=Font, allow_none=True)
364 buNone = EmptyTag()
365 buAutoNum = EmptyTag()
366 buChar = NestedValue(expected_type=str, attribute="char", allow_none=True)
367 buBlip = NestedValue(expected_type=Blip, attribute="blip", allow_none=True)
368
369 __elements__ = ('lnSpc', 'spcBef', 'spcAft', 'tabLst', 'defRPr',
370 'buClrTx', 'buClr', 'buSzTx', 'buSzPct', 'buSzPts', 'buFontTx', 'buFont',
371 'buNone', 'buAutoNum', 'buChar', 'buBlip')
372
373 def __init__(self,
374 marL=None,
375 marR=None,
376 lvl=None,
377 indent=None,
378 algn=None,
379 defTabSz=None,
380 rtl=None,
381 eaLnBrk=None,
382 fontAlgn=None,
383 latinLnBrk=None,
384 hangingPunct=None,
385 lnSpc=None,
386 spcBef=None,
387 spcAft=None,
388 tabLst=None,
389 defRPr=None,
390 extLst=None,
391 buClrTx=None,
392 buClr=None,
393 buSzTx=None,
394 buSzPct=None,
395 buSzPts=None,
396 buFontTx=None,
397 buFont=None,
398 buNone=None,
399 buAutoNum=None,
400 buChar=None,
401 buBlip=None,
402 ):
403 self.marL = marL
404 self.marR = marR
405 self.lvl = lvl
406 self.indent = indent
407 self.algn = algn
408 self.defTabSz = defTabSz
409 self.rtl = rtl
410 self.eaLnBrk = eaLnBrk
411 self.fontAlgn = fontAlgn
412 self.latinLnBrk = latinLnBrk
413 self.hangingPunct = hangingPunct
414 self.lnSpc = lnSpc
415 self.spcBef = spcBef
416 self.spcAft = spcAft
417 self.tabLst = tabLst
418 self.defRPr = defRPr
419 self.buClrTx = buClrTx
420 self.buClr = buClr
421 self.buSzTx = buSzTx
422 self.buSzPct = buSzPct
423 self.buSzPts = buSzPts
424 self.buFontTx = buFontTx
425 self.buFont = buFont
426 self.buNone = buNone
427 self.buAutoNum = buAutoNum
428 self.buChar = buChar
429 self.buBlip = buBlip
430 self.defRPr = defRPr
431
432
433class ListStyle(Serialisable):
434
435 tagname = "lstStyle"
436 namespace = DRAWING_NS
437
438 defPPr = Typed(expected_type=ParagraphProperties, allow_none=True)
439 lvl1pPr = Typed(expected_type=ParagraphProperties, allow_none=True)
440 lvl2pPr = Typed(expected_type=ParagraphProperties, allow_none=True)
441 lvl3pPr = Typed(expected_type=ParagraphProperties, allow_none=True)
442 lvl4pPr = Typed(expected_type=ParagraphProperties, allow_none=True)
443 lvl5pPr = Typed(expected_type=ParagraphProperties, allow_none=True)
444 lvl6pPr = Typed(expected_type=ParagraphProperties, allow_none=True)
445 lvl7pPr = Typed(expected_type=ParagraphProperties, allow_none=True)
446 lvl8pPr = Typed(expected_type=ParagraphProperties, allow_none=True)
447 lvl9pPr = Typed(expected_type=ParagraphProperties, allow_none=True)
448 extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True)
449
450 __elements__ = ("defPPr", "lvl1pPr", "lvl2pPr", "lvl3pPr", "lvl4pPr",
451 "lvl5pPr", "lvl6pPr", "lvl7pPr", "lvl8pPr", "lvl9pPr")
452
453 def __init__(self,
454 defPPr=None,
455 lvl1pPr=None,
456 lvl2pPr=None,
457 lvl3pPr=None,
458 lvl4pPr=None,
459 lvl5pPr=None,
460 lvl6pPr=None,
461 lvl7pPr=None,
462 lvl8pPr=None,
463 lvl9pPr=None,
464 extLst=None,
465 ):
466 self.defPPr = defPPr
467 self.lvl1pPr = lvl1pPr
468 self.lvl2pPr = lvl2pPr
469 self.lvl3pPr = lvl3pPr
470 self.lvl4pPr = lvl4pPr
471 self.lvl5pPr = lvl5pPr
472 self.lvl6pPr = lvl6pPr
473 self.lvl7pPr = lvl7pPr
474 self.lvl8pPr = lvl8pPr
475 self.lvl9pPr = lvl9pPr
476
477
478class RegularTextRun(Serialisable):
479
480 tagname = "r"
481 namespace = DRAWING_NS
482
483 rPr = Typed(expected_type=CharacterProperties, allow_none=True)
484 properties = Alias("rPr")
485 t = NestedText(expected_type=str)
486 value = Alias("t")
487
488 __elements__ = ('rPr', 't')
489
490 def __init__(self,
491 rPr=None,
492 t="",
493 ):
494 self.rPr = rPr
495 self.t = t
496
497
498class LineBreak(Serialisable):
499
500 tagname = "br"
501 namespace = DRAWING_NS
502
503 rPr = Typed(expected_type=CharacterProperties, allow_none=True)
504
505 __elements__ = ('rPr',)
506
507 def __init__(self,
508 rPr=None,
509 ):
510 self.rPr = rPr
511
512
513class TextField(Serialisable):
514
515 id = String()
516 type = String(allow_none=True)
517 rPr = Typed(expected_type=CharacterProperties, allow_none=True)
518 pPr = Typed(expected_type=ParagraphProperties, allow_none=True)
519 t = String(allow_none=True)
520
521 __elements__ = ('rPr', 'pPr')
522
523 def __init__(self,
524 id=None,
525 type=None,
526 rPr=None,
527 pPr=None,
528 t=None,
529 ):
530 self.id = id
531 self.type = type
532 self.rPr = rPr
533 self.pPr = pPr
534 self.t = t
535
536
537class Paragraph(Serialisable):
538
539 tagname = "p"
540 namespace = DRAWING_NS
541
542 # uses element group EG_TextRun
543 pPr = Typed(expected_type=ParagraphProperties, allow_none=True)
544 properties = Alias("pPr")
545 endParaRPr = Typed(expected_type=CharacterProperties, allow_none=True)
546 r = Sequence(expected_type=RegularTextRun)
547 text = Alias('r')
548 br = Typed(expected_type=LineBreak, allow_none=True)
549 fld = Typed(expected_type=TextField, allow_none=True)
550
551 __elements__ = ('pPr', 'r', 'br', 'fld', 'endParaRPr')
552
553 def __init__(self,
554 pPr=None,
555 endParaRPr=None,
556 r=None,
557 br=None,
558 fld=None,
559 ):
560 self.pPr = pPr
561 self.endParaRPr = endParaRPr
562 if r is None:
563 r = [RegularTextRun()]
564 self.r = r
565 self.br = br
566 self.fld = fld
567
568
569class GeomGuide(Serialisable):
570
571 name = String(())
572 fmla = String(())
573
574 def __init__(self,
575 name=None,
576 fmla=None,
577 ):
578 self.name = name
579 self.fmla = fmla
580
581
582class GeomGuideList(Serialisable):
583
584 gd = Sequence(expected_type=GeomGuide, allow_none=True)
585
586 def __init__(self,
587 gd=None,
588 ):
589 self.gd = gd
590
591
592class PresetTextShape(Serialisable):
593
594 prst = Typed(expected_type=Set(values=(
595 ['textNoShape', 'textPlain','textStop', 'textTriangle', 'textTriangleInverted', 'textChevron',
596 'textChevronInverted', 'textRingInside', 'textRingOutside', 'textArchUp',
597 'textArchDown', 'textCircle', 'textButton', 'textArchUpPour',
598 'textArchDownPour', 'textCirclePour', 'textButtonPour', 'textCurveUp',
599 'textCurveDown', 'textCanUp', 'textCanDown', 'textWave1', 'textWave2',
600 'textDoubleWave1', 'textWave4', 'textInflate', 'textDeflate',
601 'textInflateBottom', 'textDeflateBottom', 'textInflateTop',
602 'textDeflateTop', 'textDeflateInflate', 'textDeflateInflateDeflate',
603 'textFadeRight', 'textFadeLeft', 'textFadeUp', 'textFadeDown',
604 'textSlantUp', 'textSlantDown', 'textCascadeUp', 'textCascadeDown'
605 ]
606 )))
607 avLst = Typed(expected_type=GeomGuideList, allow_none=True)
608
609 def __init__(self,
610 prst=None,
611 avLst=None,
612 ):
613 self.prst = prst
614 self.avLst = avLst
615
616
617class TextNormalAutofit(Serialisable):
618
619 fontScale = Integer()
620 lnSpcReduction = Integer()
621
622 def __init__(self,
623 fontScale=None,
624 lnSpcReduction=None,
625 ):
626 self.fontScale = fontScale
627 self.lnSpcReduction = lnSpcReduction
628
629
630class RichTextProperties(Serialisable):
631
632 tagname = "bodyPr"
633 namespace = DRAWING_NS
634
635 rot = Integer(allow_none=True)
636 spcFirstLastPara = Bool(allow_none=True)
637 vertOverflow = NoneSet(values=(['overflow', 'ellipsis', 'clip']))
638 horzOverflow = NoneSet(values=(['overflow', 'clip']))
639 vert = NoneSet(values=(['horz', 'vert', 'vert270', 'wordArtVert',
640 'eaVert', 'mongolianVert', 'wordArtVertRtl']))
641 wrap = NoneSet(values=(['none', 'square']))
642 lIns = Integer(allow_none=True)
643 tIns = Integer(allow_none=True)
644 rIns = Integer(allow_none=True)
645 bIns = Integer(allow_none=True)
646 numCol = Integer(allow_none=True)
647 spcCol = Integer(allow_none=True)
648 rtlCol = Bool(allow_none=True)
649 fromWordArt = Bool(allow_none=True)
650 anchor = NoneSet(values=(['t', 'ctr', 'b', 'just', 'dist']))
651 anchorCtr = Bool(allow_none=True)
652 forceAA = Bool(allow_none=True)
653 upright = Bool(allow_none=True)
654 compatLnSpc = Bool(allow_none=True)
655 prstTxWarp = Typed(expected_type=PresetTextShape, allow_none=True)
656 scene3d = Typed(expected_type=Scene3D, allow_none=True)
657 extLst = Typed(expected_type=OfficeArtExtensionList, allow_none=True)
658 noAutofit = EmptyTag()
659 normAutofit = EmptyTag()
660 spAutoFit = EmptyTag()
661 flatTx = NestedInteger(attribute="z", allow_none=True)
662
663 __elements__ = ('prstTxWarp', 'scene3d', 'noAutofit', 'normAutofit', 'spAutoFit')
664
665 def __init__(self,
666 rot=None,
667 spcFirstLastPara=None,
668 vertOverflow=None,
669 horzOverflow=None,
670 vert=None,
671 wrap=None,
672 lIns=None,
673 tIns=None,
674 rIns=None,
675 bIns=None,
676 numCol=None,
677 spcCol=None,
678 rtlCol=None,
679 fromWordArt=None,
680 anchor=None,
681 anchorCtr=None,
682 forceAA=None,
683 upright=None,
684 compatLnSpc=None,
685 prstTxWarp=None,
686 scene3d=None,
687 extLst=None,
688 noAutofit=None,
689 normAutofit=None,
690 spAutoFit=None,
691 flatTx=None,
692 ):
693 self.rot = rot
694 self.spcFirstLastPara = spcFirstLastPara
695 self.vertOverflow = vertOverflow
696 self.horzOverflow = horzOverflow
697 self.vert = vert
698 self.wrap = wrap
699 self.lIns = lIns
700 self.tIns = tIns
701 self.rIns = rIns
702 self.bIns = bIns
703 self.numCol = numCol
704 self.spcCol = spcCol
705 self.rtlCol = rtlCol
706 self.fromWordArt = fromWordArt
707 self.anchor = anchor
708 self.anchorCtr = anchorCtr
709 self.forceAA = forceAA
710 self.upright = upright
711 self.compatLnSpc = compatLnSpc
712 self.prstTxWarp = prstTxWarp
713 self.scene3d = scene3d
714 self.noAutofit = noAutofit
715 self.normAutofit = normAutofit
716 self.spAutoFit = spAutoFit
717 self.flatTx = flatTx