00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef OST_CONNECTOR_IMPL_HH
00020 #define OST_CONNECTOR_IMPL_HH
00021
00022 #include <boost/enable_shared_from_this.hpp>
00023
00024 #include <ost/geom/geom.hh>
00025
00026 #include <ost/mol/impl/atom_impl_fw.hh>
00027 #include <ost/mol/impl/connector_impl_fw.hh>
00028 #include <ost/mol/impl/entity_impl_fw.hh>
00029 #include <ost/mol/entity_visitor_fw.hh>
00030
00031 #include <ost/generic_property.hh>
00032
00033 namespace ost { namespace mol { namespace impl {
00034
00035 class ConnectorImpl: public GenericPropContainerImpl,
00036 public boost::enable_shared_from_this<ConnectorImpl> {
00037 public:
00038 ConnectorImpl(const EntityImplPtr& e, const AtomImplPtr& first,
00039 const AtomImplPtr& second, Real l, Real t, Real p, unsigned char bond_order);
00040 ~ConnectorImpl();
00041
00042 AtomImplPtr GetFirst() const {return first_.lock();}
00043 AtomImplPtr GetSecond() const {return second_.lock();}
00044
00045 geom::Vec3 GetPos() const;
00046 geom::Vec3 GetOriginalPos() const;
00047
00048 Real GetLength() const;
00049 void SetLength(Real l) {len_=l;}
00050
00051
00052 bool IsConnectorOf(const AtomImplPtr& a, const AtomImplPtr& b) const;
00053
00054
00055
00056
00057 void Switch();
00058
00059 void Apply(EntityVisitor& v);
00060
00061 geom::Vec3 GetDir() const {
00062 return local_rot_*geom::Vec3(0, 0, 1);
00063 }
00064
00065 void SetDirAndLength(const geom::Vec3& dir);
00066
00067 void SetDir(const geom::Vec3& dir);
00068
00069 const geom::Mat3& GetLocalRot() const { return local_rot_; }
00070
00071 void SetBondOrder(unsigned char bo) { bond_order_ = bo; }
00072
00073 unsigned char GetBondOrder() const { return bond_order_; }
00074
00075 private:
00076 AtomImplW first_,second_;
00077 Real len_;
00078 unsigned char bond_order_;
00079
00080
00081 geom::Mat3 local_rot_;
00082 };
00083
00084 }}}
00085
00086 #endif