KiCad PCB EDA Suite
Loading...
Searching...
No Matches
transline_ident.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2011-2014 Jean-Pierre Charras
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 3
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
24#include <wx/intl.h>
25#include <wx/arrstr.h>
26#include <wx/log.h>
27
28#include <kiface_base.h>
29#include <bitmaps.h>
30
31// transline specific functions:
32#include "transline/transline.h"
34#include "transline/coplanar.h"
36#include "transline/coax.h"
38#include "transline/stripline.h"
41
44#include "transline_ident.h"
46#include <properties/property.h>
47
48
49TRANSLINE_PRM::TRANSLINE_PRM( PRM_TYPE aType, PRMS_ID aId, const char* aKeywordCfg, const wxString& aDlgLabel,
50 const wxString& aToolTip, double aValue, bool aConvUnit, int aDefaultUnit )
51{
52 m_Type = aType;
53 m_Id = aId;
54 m_DlgLabel = aDlgLabel;
55 m_KeyWord = aKeywordCfg;
56 m_ToolTip = aToolTip;
57 m_Value = aValue;
58 m_DefaultValue = aValue;
59 m_DefaultUnit = aDefaultUnit;
60 m_ConvUnit = aConvUnit;
61 m_ValueCtrl = nullptr;
62 m_UnitCtrl = nullptr;
65 }
66
67
69{
70 if( m_UnitCtrl && m_ConvUnit )
71 return 1.0 / ( (UNIT_SELECTOR*) m_UnitCtrl )->GetUnitScale();
72 else
73 return 1.0;
74}
75
76
78{
79 if( m_UnitCtrl )
80 return ( (UNIT_SELECTOR*) m_UnitCtrl )->GetUnitScale();
81 else
82 return 1.0;
83}
84
85
87{
88 m_Type = aType; // The type of transline handled
89 m_BitmapName = BITMAPS::INVALID_BITMAP; // The icon to display
90 m_TLine = nullptr; // The TRANSLINE itself
91 m_HasPrmSelection = false; // true if selection of parameters must be enabled in dialog menu
92
93 // Same H_t tooltip text is used for the microstrip and coupled-microstrip blocks below.
94 const wxString coverHeightToolTip =
95 _( "Height from substrate top to grounded cover. Leave at the large default value "
96 "for no cover." );
97
98 // Add common prms:
99 // Default values are for FR4
101 "Er", wxT( "εr" ),
102 _( "Substrate relative permittivity (dielectric constant)" ),
103 4.5, false ) );
105 "TanD", wxT( "tan δ" ),
106 _( "Dielectric loss (dissipation factor)" ),
107 2e-2, false ) );
108
109 // Default value is for copper
111 "Rho", wxT( "ρ" ),
112 _( "Electrical resistivity or specific electrical resistance of "
113 "conductor (ohm*meter)" ),
114 1.72e-8, false ) );
115
116 // Default value is in GHz
118 "Frequency", _( "Frequency" ),
119 _( "Frequency of the input signal" ), 1.0, true ) );
120
121
122 switch( m_Type )
123 {
124 case MICROSTRIP_TYPE: // microstrip
125 m_TLine = new MICROSTRIP_UI();
127
128 m_Messages.Add( wxString::Format( _( "Effective %s:" ), wxT( "εr" ) ) );
129 m_Messages.Add( _( "Unit propagation delay:" ) );
130 m_Messages.Add( _( "Conductor losses:" ) );
131 m_Messages.Add( _( "Dielectric losses:" ) );
132 m_Messages.Add( _( "Skin depth:" ) );
133
135 "H", "H", _( "Height of substrate" ), 0.2, true ) );
137 "H_t", "H(top)", coverHeightToolTip, 1e20, true ) );
139 "T", "T",
140 _( "Strip thickness" ), 0.035, true ) );
142 "Rough", _( "Roughness" ),
143 _( "Conductor roughness" ), 0.0, true ) );
145 "mu Rel S", wxString::Format( wxT( "μr (%s)" ),
146 _( "substrate" ) ),
147 _( "Relative permeability (mu) of substrate" ), 1, false ) );
149 "mu Rel C", wxString::Format( wxT( "μr (%s)" ),
150 _( "conductor" ) ),
151 _( "Relative permeability (mu) of conductor" ), 1,
152 false ) );
153
155 "W", "W", _( "Line width" ), 0.2, true ) );
157 "L", "L", _( "Line length" ), 50.0, true ) );
158
160 "Z0", "Z0", _( "Characteristic impedance" ), 50.0, true ) );
163 "Ang_l", "Ang_l", _( "Electrical length" ), 0.0, true ) );
164 break;
165
166 case CPW_TYPE: // coplanar waveguide
167 m_TLine = new COPLANAR_UI();
169 m_HasPrmSelection = true;
170
171 m_Messages.Add( wxString::Format( _( "Effective %s:" ), wxT( "εr" ) ) );
172 m_Messages.Add( _( "Unit propagation delay:" ) );
173 m_Messages.Add( _( "Conductor losses:" ) );
174 m_Messages.Add( _( "Dielectric losses:" ) );
175 m_Messages.Add( _( "Skin depth:" ) );
176
178 "H", "H", _( "Height of substrate" ), 0.2, true ) );
180 "T", "T", _( "Strip thickness" ), 0.035, true ) );
182 "mu Rel C", wxString::Format( wxT( "μ(%s)" ),
183 _( "conductor" ) ),
184 _( "Relative permeability (mu) of conductor" ), 1,
185 false ) );
186
188 "W", "W", _( "Line width" ), 0.2, true ) );
190 "S", "S", _( "Gap width" ), 0.2, true ) );
192 "L", "L", _( "Line length" ), 50.0, true ) );
193
195 "Z0", "Z0", _( "Characteristic impedance" ), 50.0, true ) );
198 "Ang_l", "Ang_l", _( "Electrical length" ), 0.0, true ) );
199 break;
200
201 case GROUNDED_CPW_TYPE: // grounded coplanar waveguide
204 m_HasPrmSelection = true;
205
206 m_Messages.Add( wxString::Format( _( "Effective %s:" ), wxT( "εr" ) ) );
207 m_Messages.Add( _( "Unit propagation delay:" ) );
208 m_Messages.Add( _( "Conductor losses:" ) );
209 m_Messages.Add( _( "Dielectric losses:" ) );
210 m_Messages.Add( _( "Skin depth:" ) );
211
213 "H", "H", _( "Height of substrate" ), 0.2, true ) );
215 "T", "T", _( "Strip thickness" ), 0.035, true ) );
217 "mu Rel C", wxString::Format( wxT( "μ(%s)" ),
218 _( "conductor" ) ),
219 _( "Relative permeability (mu) of conductor" ), 1,
220 false ) );
221
223 "W", "W", _( "Line width" ), 0.2, true ) );
225 "S", "S", _( "Gap width" ), 0.2, true ) );
227 "L", "L", _( "Line length" ), 50.0, true ) );
228
230 "Z0", "Z0", _( "Characteristic impedance" ), 50.0, true ) );
233 "Ang_l", "Ang_l", _( "Electrical length" ), 0, true ) );
234 break;
235
236
237 case RECTWAVEGUIDE_TYPE: // rectangular waveguide
240 m_HasPrmSelection = true;
241
242 m_Messages.Add( _( "ZF(H10) = Ey / Hx:" ) );
243 m_Messages.Add( wxString::Format( _( "Effective %s:" ), wxT( "εr" ) ) );
244 m_Messages.Add( _( "Conductor losses:" ) );
245 m_Messages.Add( _( "Dielectric losses:" ) );
246 m_Messages.Add( _( "TE-modes:" ) );
247 m_Messages.Add( _( "TM-modes:" ) );
248
250 "mu Rel I", wxString::Format( wxT( "μ(%s)" ),
251 _( "insulator" ) ),
252 _( "Relative permeability (mu) of insulator" ), 1, false ) );
254 "mu Rel C", wxString::Format( wxT( "μ(%s)" ),
255 _( "conductor" ) ),
256 _( "Relative permeability (mu) of conductor" ), 1,
257 false ) );
258
260 "a", "a", _( "Width of waveguide" ), 10.0, true ) );
262 "b", "b", _( "Height of waveguide" ), 5.0, true ) );
264 "L", "L", _( "Waveguide length" ), 50.0, true ) );
265
267 "Z0", "Z0", _( "Characteristic impedance" ), 50.0, true ) );
270 "Ang_l", "Ang_l", _( "Electrical length" ), 0, true ) );
271 break;
272
273 case COAX_TYPE: // coaxial cable
274 m_TLine = new COAX_UI();
276 m_HasPrmSelection = true;
277
278 m_Messages.Add( wxString::Format( _( "Effective %s:" ), wxT( "εr" ) ) );
279 m_Messages.Add( _( "Conductor losses:" ) );
280 m_Messages.Add( _( "Dielectric losses:" ) );
281 m_Messages.Add( _( "TE-modes:" ) );
282 m_Messages.Add( _( "TM-modes:" ) );
283
285 "mu Rel I", wxString::Format( wxT( "μ(%s)" ),
286 _( "insulator" ) ),
287 _( "Relative permeability (mu) of insulator" ), 1, false ) );
289 "mu Rel C", wxString::Format( wxT( "μ(%s)" ),
290 _( "conductor" ) ),
291 _( "Relative permeability (mu) of conductor" ), 1,
292 false ) );
293
295 "Din", _( "Din" ),
296 _( "Inner diameter (conductor)" ), 1.0, true ) );
298 "Dout", _( "Dout" ),
299 _( "Outer diameter (insulator)" ), 8.0, true ) );
301 "L", "L", _( "Line length" ), 50.0, true ) );
302
304 "Z0", "Z0", _( "Characteristic impedance" ), 50.0, true ) );
307 "Ang_l", "Ang_l", _( "Electrical length" ), 0.0, true ) );
308 break;
309
310 case C_MICROSTRIP_TYPE: // coupled microstrip
311 m_TLine = new C_MICROSTRIP();
313 m_HasPrmSelection = true;
314
315 m_Messages.Add( wxString::Format( _( "Effective %s (even):" ), wxT( "εr" ) ) );
316 m_Messages.Add( wxString::Format( _( "Effective %s (odd):" ), wxT( "εr" ) ) );
317 m_Messages.Add( _( "Unit propagation delay (even):" ) );
318 m_Messages.Add( _( "Unit propagation delay (odd):" ) );
319 m_Messages.Add( _( "Conductor losses (even):" ) );
320 m_Messages.Add( _( "Conductor losses (odd):" ) );
321 m_Messages.Add( _( "Dielectric losses (even):" ) );
322 m_Messages.Add( _( "Dielectric losses (odd):" ) );
323 m_Messages.Add( _( "Skin depth:" ) );
324 m_Messages.Add( _( "Differential Impedance (Zd):" ) );
325
327 "H", "H", _( "Height of substrate" ), 0.2, true ) );
329 "H_t", "H_t", coverHeightToolTip, 1e20, true ) );
331 "T", "T", _( "Strip thickness" ), 0.035, true ) );
333 "Rough", _( "Roughness" ),
334 _( "Conductor roughness" ), 0.0, true ) );
336 "mu rel C", wxString::Format( wxT( "μ(%s)" ),
337 _( "conductor" ) ),
338 _( "Relative permeability (mu) of conductor" ), 1,
339 false ) );
340
342 "W", "W", _( "Line width" ), 0.2, true ) );
344 "S", "S", _( "Gap width" ), 0.2, true ) );
346 "L", "L", _( "Line length" ), 50.0, true ) );
347
348 AddPrm( new TRANSLINE_PRM( PRM_TYPE_ELEC, Z0_E_PRM, "Zeven", _( "Zeven" ),
349 _( "Even mode impedance (lines driven by common voltages)" ), 50.0, true ) );
350 AddPrm( new TRANSLINE_PRM( PRM_TYPE_ELEC, Z0_O_PRM, "Zodd", _( "Zodd" ),
351 _( "Odd mode impedance (lines driven by opposite "
352 "(differential) voltages)" ),
353 50.0, true ) );
354 AddPrm( new TRANSLINE_PRM( PRM_TYPE_ELEC, ANG_L_PRM, "Ang_l", "Ang_l", _( "Electrical length" ), 0.0, true ) );
355 break;
356
357 case C_STRIPLINE_TYPE: // Coupled stripline
358 m_TLine = new C_STRIPLINE();
360 m_HasPrmSelection = true;
361
362 m_Messages.Add( wxString::Format( _( "Effective %s (even):" ), wxT( "εr" ) ) );
363 m_Messages.Add( wxString::Format( _( "Effective %s (odd):" ), wxT( "εr" ) ) );
364 m_Messages.Add( _( "Unit propagation delay (even):" ) );
365 m_Messages.Add( _( "Unit propagation delay (odd):" ) );
366 m_Messages.Add( _( "Skin depth:" ) );
367 m_Messages.Add( _( "Differential Impedance (Zd):" ) );
368 m_Messages.Add( _( "Common-mode Impedance (Zcomm):" ) );
369 m_Messages.Add( _( "Coupling coefficient (kc):" ) );
370
371 AddPrm( new TRANSLINE_PRM( PRM_TYPE_SUBS, H_PRM, "H", "H", _( "Height of substrate" ), 0.2, true ) );
372 // Zero default keeps the math layer on the centred fast path so existing designs that
373 // never touched 'a' remain bit-identical to the pre-offset behaviour.
375 _( "Distance from track to closest ground plane "
376 "(default: centered)" ),
377 0.0, true ) );
378 AddPrm( new TRANSLINE_PRM( PRM_TYPE_SUBS, T_PRM, "T", "T", _( "Strip thickness" ), 0.035, true ) );
379 AddPrm( new TRANSLINE_PRM( PRM_TYPE_SUBS, MURC_PRM, "mu rel C",
380 wxString::Format( wxT( "μ(%s)" ), _( "conductor" ) ),
381 _( "Relative permeability (mu) of conductor" ), 1, false ) );
382
383 AddPrm( new TRANSLINE_PRM( PRM_TYPE_PHYS, PHYS_WIDTH_PRM, "W", "W", _( "Line width" ), 0.2, true ) );
384 AddPrm( new TRANSLINE_PRM( PRM_TYPE_PHYS, PHYS_S_PRM, "S", "S", _( "Gap width" ), 0.2, true ) );
385 AddPrm( new TRANSLINE_PRM( PRM_TYPE_PHYS, PHYS_LEN_PRM, "L", "L", _( "Line length" ), 50.0, true ) );
386
388 "Zeven", _( "Zeven" ),
389 _( "Even mode impedance (lines driven by common voltages)" ),
390 50.0, true ) );
392 "Zodd", _( "Zodd" ),
393 _( "Odd mode impedance (lines driven by opposite "
394 "(differential) voltages)" ), 50.0, true ) );
396 "Ang_l", "Ang_l",
397 _( "Electrical length" ), 0.0, true ) );
398 break;
399
400 case STRIPLINE_TYPE: // stripline
401 m_TLine = new STRIPLINE_UI();
403
404 m_Messages.Add( wxString::Format( _( "Effective %s:" ), wxT( "εr" ) ) );
405 m_Messages.Add( _( "Unit propagation delay:" ) );
406 m_Messages.Add( _( "Conductor losses:" ) );
407 m_Messages.Add( _( "Dielectric losses:" ) );
408 m_Messages.Add( _( "Skin depth:" ) );
409
411 "H", "H", _( "Height of substrate" ), 0.2, true ) );
413 "a", "a", _( "Distance between strip and top metal" ), 0.2,
414 true ) );
416 "T", "T", _( "Strip thickness" ), 0.035, true ) );
418 "mu Rel C", wxString::Format( wxT( "μ(%s)" ),
419 _( "conductor" ) ),
420 _( "Relative permeability (mu) of conductor" ), 1, false ) );
421
423 "W", "W", _( "Line width" ), 0.2, true ) );
425 "L", "L", _( "Line length" ), 50.0, true ) );
426
428 "Z0", "Z0", _( "Characteristic impedance" ), 50, true ) );
431 "Ang_l", "Ang_l", _( "Electrical length" ), 0, true ) );
432 break;
433
434 case TWISTEDPAIR_TYPE: // twisted pair
435 m_TLine = new TWISTEDPAIR_UI();
437 m_HasPrmSelection = true;
438
439 m_Messages.Add( wxString::Format( _( "Effective %s:" ), wxT( "εr" ) ) );
440 m_Messages.Add( _( "Conductor losses:" ) );
441 m_Messages.Add( _( "Dielectric losses:" ) );
442 m_Messages.Add( _( "Skin depth:" ) );
443
445 "Twists", _( "Twists" ),
446 _( "Number of twists per length" ), 0.0, false ) );
448 "mu Rel C", wxString::Format( wxT( "μ(%s)" ),
449 _( "conductor" ) ),
450 _( "Relative permeability (mu) of conductor" ), 1,
451 false ) );
453 "ErEnv", wxString::Format( wxT( "εr(%s)" ),
454 _( "environment" ) ),
455 _( "Relative permittivity of environment" ), 1,
456 false ) );
458 "Din", _( "Din" ),
459 _( "Inner diameter (conductor)" ), 1.0, true ) );
461 "Dout", _( "Dout" ),
462 _( "Outer diameter (insulator)" ), 8.0, true ) );
464 "L", "L", _( "Cable length" ), 50.0, true ) );
465
467 "Z0", "Z0", _( "Characteristic impedance" ), 50.0, true ) );
470 "Ang_l", "Ang_l", _( "Electrical length" ), 0.0, true ) );
471 break;
472
473 case END_OF_LIST_TYPE: // Not really used
474 break;
475 }
476}
477
479{
480 delete m_TLine;
481
482 for( auto& ii : m_prms_List )
483 delete ii;
484
485 m_prms_List.clear();
486}
487
488
490{
491 auto cfg = static_cast<PCB_CALCULATOR_SETTINGS*>( Kiface().KifaceSettings() );
492 std::string name( m_TLine->m_Name );
493
494 // Recover C_STRIPLINE data that legacy builds wrote under the colliding "Coupled_MicroStrip"
495 // key. Distinguish by the c_microstrip-exclusive parameters H_t and Rough; if absent, the
496 // payload is stripline and belongs to the new key.
497 // TODO remove after KiCad 10.1 (two stable releases)
498 if( name == "Coupled_Stripline" && !cfg->m_TransLine.param_values.count( name ) )
499 {
500 const std::string legacyKey = "Coupled_MicroStrip";
501 auto legacyValuesIt = cfg->m_TransLine.param_values.find( legacyKey );
502 auto legacyUnitsIt = cfg->m_TransLine.param_units.find( legacyKey );
503
504 // Require both maps to have the legacy entry so values and units stay paired; the
505 // downstream lookup asserts that param_units is populated whenever param_values is.
506 if( legacyValuesIt != cfg->m_TransLine.param_values.end()
507 && legacyUnitsIt != cfg->m_TransLine.param_units.end() )
508 {
509 const auto& legacyValues = legacyValuesIt->second;
510 const bool looksLikeCMicrostrip = legacyValues.count( "H_t" ) || legacyValues.count( "Rough" );
511
512 if( !looksLikeCMicrostrip )
513 {
514 cfg->m_TransLine.param_values[name] = legacyValues;
515 cfg->m_TransLine.param_units[name] = legacyUnitsIt->second;
516
517 // Empty the legacy entry in place so the coupled-microstrip tab falls back to
518 // defaults instead of loading stripline data under its normal key. The outer
519 // map entries must remain because PARAM_MAP holds a raw pointer to the inner
520 // map captured at settings-ctor time; erasing would dangle those pointers.
521 legacyValuesIt->second.clear();
522 legacyUnitsIt->second.clear();
523 }
524 else
525 {
526 wxLogTrace( wxT( "KICAD_TRANSLINE" ),
527 wxT( "Legacy Coupled_MicroStrip settings look like coupled-microstrip "
528 "data; Coupled_Stripline will fall back to defaults." ) );
529 }
530 }
531 }
532
533 if( cfg->m_TransLine.param_values.count( name ) )
534 {
535 wxASSERT( cfg->m_TransLine.param_units.count( name ) );
536
537 for( auto& p : m_prms_List )
538 {
539 try
540 {
541 p->m_Value = cfg->m_TransLine.param_values.at( name ).at( p->m_KeyWord );
542 p->m_UnitSelection = cfg->m_TransLine.param_units.at( name ).at( p->m_KeyWord );
543 }
544 catch( ... )
545 {}
546 }
547 }
548}
549
550
552{
553 auto cfg = static_cast<PCB_CALCULATOR_SETTINGS*>( Kiface().KifaceSettings() );
554 std::string name( m_TLine->m_Name );
555
556 for( auto& param : m_prms_List )
557 {
558 if( !std::isfinite( param->m_Value ) )
559 param->m_Value = 0;
560
561 cfg->m_TransLine.param_values[ name ][ param->m_KeyWord ] = param->m_Value;
562 cfg->m_TransLine.param_units[ name ][ param->m_KeyWord ] = param->m_UnitSelection;
563 }
564}
565
const char * name
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
@ coupled_stripline
@ INVALID_BITMAP
UI wrapper for an ungrounded coplanar waveguide.
UI wrapper for a conductor-backed coplanar waveguide.
APP_SETTINGS_BASE * KifaceSettings() const
Definition kiface_base.h:95
UI wrapper for the rectangular waveguide calculator.
TRANSLINE * m_TLine
enum TRANSLINE_TYPE_ID m_Type
void AddPrm(TRANSLINE_PRM *aParam)
TRANSLINE_IDENT(enum TRANSLINE_TYPE_ID aType)
wxArrayString m_Messages
std::vector< TRANSLINE_PRM * > m_prms_List
A class to handle one parameter of transline.
TRANSLINE_PRM(PRM_TYPE aType, PRMS_ID aId, const char *aKeywordCfg="", const wxString &aDlgLabel=wxEmptyString, const wxString &aToolTip=wxEmptyString, double aValue=0.0, bool aConvUnit=false, int aDefaultUnit=0)
double m_NormalizedValue
wxString m_DlgLabel
std::string m_KeyWord
UI wrapper for the twisted-pair calculator.
#define _(s)
PRMS_ID
Definition transline.h:39
@ TWISTEDPAIR_EPSILONR_ENV_PRM
Definition transline.h:51
@ Z0_O_PRM
Definition transline.h:56
@ FREQUENCY_PRM
Definition transline.h:53
@ DUMMY_PRM
Definition transline.h:63
@ RHO_PRM
Definition transline.h:43
@ PHYS_DIAM_OUT_PRM
Definition transline.h:61
@ T_PRM
Definition transline.h:48
@ Z0_E_PRM
Definition transline.h:55
@ MURC_PRM
Definition transline.h:52
@ MUR_PRM
Definition transline.h:50
@ STRIPLINE_A_PRM
Definition transline.h:47
@ Z0_PRM
Definition transline.h:54
@ TAND_PRM
Definition transline.h:42
@ PHYS_LEN_PRM
Definition transline.h:62
@ ANG_L_PRM
Definition transline.h:57
@ H_T_PRM
Definition transline.h:46
@ TWISTEDPAIR_TWIST_PRM
Definition transline.h:45
@ PHYS_DIAM_IN_PRM
Definition transline.h:59
@ ROUGH_PRM
Definition transline.h:49
@ EPSILONR_PRM
Definition transline.h:41
@ PHYS_S_PRM
Definition transline.h:60
@ H_PRM
Definition transline.h:44
@ PHYS_WIDTH_PRM
Definition transline.h:58
PRM_TYPE
@ PRM_TYPE_FREQUENCY
@ PRM_TYPE_SUBS
@ PRM_TYPE_ELEC
@ PRM_TYPE_PHYS
TRANSLINE_TYPE_ID
@ RECTWAVEGUIDE_TYPE
@ MICROSTRIP_TYPE
@ CPW_TYPE
@ GROUNDED_CPW_TYPE
@ C_MICROSTRIP_TYPE
@ COAX_TYPE
@ TWISTEDPAIR_TYPE
@ END_OF_LIST_TYPE
@ STRIPLINE_TYPE
@ C_STRIPLINE_TYPE