diff --git a/modules/mol/base/pymod/export_coord_group.cc b/modules/mol/base/pymod/export_coord_group.cc index fa3a06132292cc2e65d727197e2888832c54da0b..4ada5f884128222afb2ea55057274be43f2df5f9 100644 --- a/modules/mol/base/pymod/export_coord_group.cc +++ b/modules/mol/base/pymod/export_coord_group.cc @@ -38,6 +38,8 @@ namespace { void (CoordGroupHandle::*capture1)()=&CoordGroupHandle::Capture; void (CoordGroupHandle::*capture2)(uint)=&CoordGroupHandle::Capture; + void (CoordGroupHandle::*add_frame1)(const geom::Vec3List&)=&CoordGroupHandle::AddFrame; + void (CoordGroupHandle::*add_frame2)(const geom::Vec3List&,const geom::Vec3&,const geom::Vec3&)=&CoordGroupHandle::AddFrame; } void export_CoordGroup() @@ -47,7 +49,8 @@ void export_CoordGroup() .def("GetEntity",&CoordGroupHandle::GetEntity) .def("GetAtomCount",&CoordGroupHandle::GetAtomCount) .def("AddFrames", &CoordGroupHandle::AddFrames) - .def("AddFrame", &CoordGroupHandle::AddFrame) + .def("AddFrame", add_frame1) + .def("AddFrame", add_frame2) .def("GetFrameCount",&CoordGroupHandle::GetFrameCount) .def("GetFramePositions",&CoordGroupHandle::GetFramePositions) .def("SetFramePositions",&CoordGroupHandle::SetFramePositions) diff --git a/modules/mol/base/src/coord_group.cc b/modules/mol/base/src/coord_group.cc index 127c82463bf20c1df65f2f0234d3474bdc3c78ed..949199240497fcbee751dce8c85639bf22c246cf 100644 --- a/modules/mol/base/src/coord_group.cc +++ b/modules/mol/base/src/coord_group.cc @@ -103,6 +103,16 @@ CoordGroupHandle::operator bool() const } } + void CoordGroupHandle::AddFrame(const geom::Vec3List& clist, const geom::Vec3& cell_size, const geom::Vec3& cell_angles) +{ + this->CheckValidity(); + if (source_->IsMutable()) { + source_->AddFrame(clist,cell_size,cell_angles); + } else { + throw IntegrityError("Can't add frame to immutable CoordGroup"); + } +} + void CoordGroupHandle::AddFrames(const CoordGroupHandle& cg) { this->CheckValidity(); @@ -142,7 +152,7 @@ CoordFramePtr CoordGroupHandle::GetFrame(uint frame) const this->CheckValidity(); return source_->GetFrame(frame); } - + AtomHandleList CoordGroupHandle::GetAtomList() const { this->CheckValidity(); diff --git a/modules/mol/base/src/coord_group.hh b/modules/mol/base/src/coord_group.hh index 22a829dd662f50d8bee3cb6490806ca120039f01..8aa907f4fd050411998b7973e4390e563912da9d 100644 --- a/modules/mol/base/src/coord_group.hh +++ b/modules/mol/base/src/coord_group.hh @@ -69,7 +69,8 @@ public: /// \brief add frame //void AddFrame(const std::vector<geom::Vec3>& clist); void AddFrame(const geom::Vec3List& clist); - + void AddFrame(const geom::Vec3List& clist,const geom::Vec3& cell_size,const geom::Vec3& cell_angles); + void AddFrames(const CoordGroupHandle& cg); /// \brief set an indidivial atom position in the given frame void SetAtomPos(uint frame, AtomHandle atom, const geom::Vec3& pos); diff --git a/modules/mol/base/src/coord_source.hh b/modules/mol/base/src/coord_source.hh index 604817535d9bc2fc0bd12c20739135e287642862..fec0d9946cb2ecd275abb23d5ebb58b080422734 100644 --- a/modules/mol/base/src/coord_source.hh +++ b/modules/mol/base/src/coord_source.hh @@ -70,6 +70,7 @@ public: void Capture(uint f); virtual void AddFrame(const std::vector<geom::Vec3>& coords) = 0; + virtual void AddFrame(const std::vector<geom::Vec3>& coords,const geom::Vec3& cell_size,const geom::Vec3& cell_angles) = 0; virtual void InsertFrame(int pos, const std::vector<geom::Vec3>& coords) = 0; protected: void SetMutable(bool flag); diff --git a/modules/mol/base/src/in_mem_coord_source.cc b/modules/mol/base/src/in_mem_coord_source.cc index 1690c11048713795f5bf3d86bbef29b9fb82702f..ea01db894a69efa04189e126b3f2d6429df46f12 100644 --- a/modules/mol/base/src/in_mem_coord_source.cc +++ b/modules/mol/base/src/in_mem_coord_source.cc @@ -30,6 +30,12 @@ void InMemCoordSource::AddFrame(const std::vector<geom::Vec3>& coords) frames_.push_back(fp); } +void InMemCoordSource::AddFrame(const std::vector<geom::Vec3>& coords,const geom::Vec3& cell_size,const geom::Vec3& cell_angles) +{ + CoordFramePtr fp(new CoordFrame(coords,cell_size,cell_angles)); + frames_.push_back(fp); +} + void InMemCoordSource::InsertFrame(int pos, const std::vector<geom::Vec3>& coords) { CoordFrameList::iterator it = frames_.begin(); diff --git a/modules/mol/base/src/in_mem_coord_source.hh b/modules/mol/base/src/in_mem_coord_source.hh index dc032ebbea294fdc6b4bb7ba86d79847b5e818ca..0984791aae634bcf315efe08f55f10850ef77c5f 100644 --- a/modules/mol/base/src/in_mem_coord_source.hh +++ b/modules/mol/base/src/in_mem_coord_source.hh @@ -44,6 +44,7 @@ public: void AddFrame(const CoordFramePtr& frame); virtual void AddFrame(const std::vector<geom::Vec3>& coords); + virtual void AddFrame(const std::vector<geom::Vec3>& coords,const geom::Vec3& cell_size,const geom::Vec3& cell_angles); virtual void InsertFrame(int pos, const std::vector<geom::Vec3>& coords); private: