@@ -30,11 +30,13 @@ std::optional<dbOrientType::Value> dbOrientType::fromString(const char* orient)
3030 ret = R270;
3131 } else if (strcasecmp (orient, " MY" ) == 0 ) {
3232 ret = MY;
33- } else if (strcasecmp (orient, " MYR90" ) == 0 ) {
33+ } else if (strcasecmp (orient, " MYR90" ) == 0
34+ || strcasecmp (orient, " MY_R90" ) == 0 ) {
3435 ret = MYR90;
3536 } else if (strcasecmp (orient, " MX" ) == 0 ) {
3637 ret = MX;
37- } else if (strcasecmp (orient, " MXR90" ) == 0 ) {
38+ } else if (strcasecmp (orient, " MXR90" ) == 0
39+ || strcasecmp (orient, " MX_R90" ) == 0 ) {
3840 ret = MXR90;
3941 } else if (strcasecmp (orient, " N" ) == 0 ) { // LEF/DEF style names
4042 ret = R0;
@@ -186,6 +188,68 @@ bool dbOrientType::isRightAngleRotation() const
186188 return false ;
187189}
188190
191+ std::optional<dbOrientType3D> dbOrientType3D::fromString (
192+ const std::string& orient)
193+ {
194+ std::string orient_str = orient;
195+ bool mirror_z = false ;
196+ // check if the orient string contains "MZ"
197+ if (orient_str == " MZ" ) {
198+ return dbOrientType3D (dbOrientType::R0, true );
199+ }
200+ if (orient_str.find (" MZ_" ) != std::string::npos) {
201+ mirror_z = true ;
202+ orient_str = orient_str.erase (orient_str.find (" MZ_" ), 3 );
203+ }
204+ auto opt = dbOrientType::fromString (orient_str.c_str ());
205+ if (!opt.has_value ()) {
206+ return std::nullopt ;
207+ }
208+ return dbOrientType3D (opt.value (), mirror_z);
209+ }
210+
211+ dbOrientType3D::dbOrientType3D (const std::string& orient)
212+ {
213+ auto opt = fromString (orient);
214+ if (opt.has_value ()) {
215+ value_ = opt.value ().value_ ;
216+ mirror_z_ = opt.value ().mirror_z_ ;
217+ } else {
218+ value_ = dbOrientType::DEFAULT;
219+ mirror_z_ = false ;
220+ }
221+ }
222+
223+ dbOrientType3D::dbOrientType3D (const dbOrientType& orient, bool mirror_z)
224+ {
225+ value_ = orient.getValue ();
226+ mirror_z_ = mirror_z;
227+ }
228+
229+ std::string dbOrientType3D::getString () const
230+ {
231+ if (mirror_z_ && getOrientType2D () == dbOrientType::R0) {
232+ return " MZ" ;
233+ }
234+ std::string orient_2d_str = getOrientType2D ().getString ();
235+ if (orient_2d_str == " MXR90" ) {
236+ orient_2d_str = " MX_R90" ;
237+ } else if (orient_2d_str == " MYR90" ) {
238+ orient_2d_str = " MY_R90" ;
239+ }
240+ return (mirror_z_ ? " MZ_" : " " ) + orient_2d_str;
241+ }
242+
243+ dbOrientType dbOrientType3D::getOrientType2D () const
244+ {
245+ return value_;
246+ }
247+
248+ bool dbOrientType3D::isMirrorZ () const
249+ {
250+ return mirror_z_;
251+ }
252+
189253dbGDSSTrans::dbGDSSTrans ()
190254{
191255 _flipX = false ;
@@ -269,6 +333,22 @@ dbOStream& operator<<(dbOStream& stream, const dbGDSSTrans t)
269333 return stream;
270334}
271335
336+ dbIStream& operator >>(dbIStream& stream, dbOrientType3D& t)
337+ {
338+ uint8_t value;
339+ stream >> value;
340+ t.value_ = static_cast <dbOrientType::Value>(value);
341+ stream >> t.mirror_z_ ;
342+ return stream;
343+ }
344+
345+ dbOStream& operator <<(dbOStream& stream, const dbOrientType3D t)
346+ {
347+ stream << static_cast <uint8_t >(t.value_ );
348+ stream << t.mirror_z_ ;
349+ return stream;
350+ }
351+
272352dbIStream& operator >>(dbIStream& stream, dbGDSTextPres& t)
273353{
274354 uint8_t vPresTemp, hPresTemp;
0 commit comments