@@ -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,62 @@ 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 flipZ = false ;
196+ // check if the orient string contains "MZ"
197+ if (orient_str.find (" MZ_" ) != std::string::npos) {
198+ flipZ = true ;
199+ orient_str = orient_str.erase (orient_str.find (" MZ_" ), 3 );
200+ }
201+ auto opt = dbOrientType::fromString (orient_str.c_str ());
202+ if (!opt.has_value ()) {
203+ return std::nullopt ;
204+ }
205+ return dbOrientType3D (opt.value (), flipZ);
206+ }
207+
208+ dbOrientType3D::dbOrientType3D (const char * orient)
209+ {
210+ auto opt = fromString (orient);
211+ if (opt.has_value ()) {
212+ value_ = opt.value ().value_ ;
213+ mirror_z_ = opt.value ().mirror_z_ ;
214+ } else {
215+ value_ = dbOrientType::DEFAULT;
216+ mirror_z_ = false ;
217+ }
218+ }
219+
220+ dbOrientType3D::dbOrientType3D (const dbOrientType& orient, bool mirror_z)
221+ {
222+ value_ = orient.getValue ();
223+ mirror_z_ = mirror_z;
224+ }
225+
226+ std::string dbOrientType3D::getString () const
227+ {
228+ std::string orient_2d_str = getOrientType2D ().getString ();
229+ if (orient_2d_str == " MXR90" ) {
230+ orient_2d_str = " MX_R90" ;
231+ } else if (orient_2d_str == " MYR90" ) {
232+ orient_2d_str = " MY_R90" ;
233+ }
234+ return (mirror_z_ ? " MZ_" : " " ) + orient_2d_str;
235+ }
236+
237+ dbOrientType dbOrientType3D::getOrientType2D () const
238+ {
239+ return value_;
240+ }
241+
242+ bool dbOrientType3D::isMirrorZ () const
243+ {
244+ return mirror_z_;
245+ }
246+
189247dbGDSSTrans::dbGDSSTrans ()
190248{
191249 _flipX = false ;
@@ -269,6 +327,22 @@ dbOStream& operator<<(dbOStream& stream, const dbGDSSTrans t)
269327 return stream;
270328}
271329
330+ dbIStream& operator >>(dbIStream& stream, dbOrientType3D& t)
331+ {
332+ uint8_t value;
333+ stream >> value;
334+ t.value_ = static_cast <dbOrientType::Value>(value);
335+ stream >> t.mirror_z_ ;
336+ return stream;
337+ }
338+
339+ dbOStream& operator <<(dbOStream& stream, const dbOrientType3D t)
340+ {
341+ stream << static_cast <uint8_t >(t.value_ );
342+ stream << t.mirror_z_ ;
343+ return stream;
344+ }
345+
272346dbIStream& operator >>(dbIStream& stream, dbGDSTextPres& t)
273347{
274348 uint8_t vPresTemp, hPresTemp;
0 commit comments