void draw_control::xlsx_convert(oox::xlsx_conversion_context & Context) { if (!control_id_) return; oox::forms_context::_state & state = Context.get_forms_context().get_state_element(*control_id_); if (state.id.empty()) return; if (state.ctrlPropId.empty()) { std::wstring target; state.ctrlPropId = Context.get_mediaitems().add_control_props(target); std::wstringstream strm; form_element* control = dynamic_cast<form_element*>(state.element); if (control) { control->serialize_control_props(strm); } Context.add_control_props(state.ctrlPropId, target, strm.str()); } Context.get_drawing_context().start_frame(); Context.get_drawing_context().set_control(state.ctrlPropId); common_xlsx_convert(Context); Context.get_drawing_context().end_frame(); Context.get_drawing_context().clear(); }
void xlsx_convert_transforms(std::wstring transformStr, oox::xlsx_conversion_context & Context) { std::vector<std::wstring> transforms; boost::algorithm::split(transforms,transformStr, boost::algorithm::is_any_of(L")"), boost::algorithm::token_compress_on); for (size_t i = 0; i < transforms.size(); i++) { std::vector<std::wstring> transform; boost::algorithm::split(transform, transforms[i], boost::algorithm::is_any_of(L"("), boost::algorithm::token_compress_on); if (transform.size()>1)//тока с аргументами { int res=0; if ((res = transform[0].find(L"translate"))>=0)//перемещение { std::vector<length> Points ; parse_string_to_points(transform[1], Points); if (Points.size()>0) { double x_pt = Points[0].get_value_unit(length::pt); double y_pt = 0; if (Points.size()>1)y_pt = Points[1].get_value_unit(length::pt);//ее может не быть Context.get_drawing_context().set_translate(x_pt,y_pt); } } else if ((res = transform[0].find(L"scale"))>=0)//масштабирование { std::vector<length> Points ; parse_string_to_points(transform[1], Points); if (Points.size()>0) { double x_pt = Points[0].get_value_unit(length::pt); double y_pt = x_pt; if (Points.size()>1)y_pt = Points[1].get_value_unit(length::pt);//ее может не быть Context.get_drawing_context().set_scale(x_pt,y_pt); } } else if ((res = transform[0].find(L"rotate"))>=0)//вращение { Context.get_drawing_context().set_rotate(boost::lexical_cast<double>(transform[1])); } else if ((res = transform[0].find(L"skewX"))>=0)//сдвиг { double angle = boost::lexical_cast<double>(transform[1]); Context.get_drawing_context().set_property(_property(L"svg:skewX",angle)); } else if ((res = transform[0].find(L"skewY"))>=0)//сдвиг { double angle = boost::lexical_cast<double>(transform[1]); Context.get_drawing_context().set_property(_property(L"svg:skewY",angle)); } } } }
void draw_custom_shape::xlsx_convert(oox::xlsx_conversion_context & Context) { Context.get_drawing_context().start_shape(7); common_xlsx_convert(Context); Context.get_drawing_context().end_shape(); Context.get_drawing_context().clear(); }
void draw_a::xlsx_convert(oox::xlsx_conversion_context & Context) { Context.get_drawing_context().start_action(L""); Context.get_drawing_context().set_link(common_xlink_attlist_.href_.get_value_or(L"")); Context.get_drawing_context().end_action(); for (size_t i = 0; i < content_.size(); i++) { content_[i]->xlsx_convert(Context); } }
void draw_chart::xlsx_convert(oox::xlsx_conversion_context & Context) { const std::wstring href = common_xlink_attlist_.href_.get_value_or(L""); Context.get_drawing_context().start_chart(href); for (int i = 0 ; i < content_.size(); i++) { content_[i]->xlsx_convert(Context); } Context.get_drawing_context().end_chart(); }
void dr3d_scene::xlsx_convert(oox::xlsx_conversion_context & Context) { //const std::wstring style = common_shape_draw_attlist_.draw_text_style_name_.get_value_or(L""); Context.get_drawing_context().start_shape(1);//rect с наваротами-атрибутами .. а-ля TextBox common_xlsx_convert(Context); Context.get_drawing_context().end_shape(); Context.get_drawing_context().clear(); }
void draw_polyline::xlsx_convert(oox::xlsx_conversion_context & Context) { reset_polyline_path(); /////////////////////////////////////////////////////////////////////// Context.get_drawing_context().start_shape(8); common_xlsx_convert(Context); Context.get_drawing_context().end_shape(); Context.get_drawing_context().clear(); }
void draw_line::xlsx_convert(oox::xlsx_conversion_context & Context) { Context.get_drawing_context().start_shape(5); reset_svg_attributes(); common_xlsx_convert(Context); Context.get_drawing_context().end_shape(); Context.get_drawing_context().clear(); }
void draw_object_ole::xlsx_convert(oox::xlsx_conversion_context & Context) { //временно - замещающая картинка(если она конечно присутствует) //Context.get_drawing_context().start_object_ole(); Context.get_drawing_context().set_use_image_replacement(); //Context.get_drawing_context().end_object_ole(); }
void draw_text_box::xlsx_convert(oox::xlsx_conversion_context & Context) { Context.get_drawing_context().start_shape(2);//rect с наваротами Context.get_text_context().start_drawing_content(); for (int i = 0 ; i < content_.size(); i++) { content_[i]->xlsx_convert(Context); } std::wstring text_content_ = Context.get_text_context().end_drawing_content(); if (text_content_.length()>0) { Context.get_drawing_context().set_property(_property(L"text-content",text_content_)); } Context.get_drawing_context().end_shape(); }
void draw_image::xlsx_convert(oox::xlsx_conversion_context & Context) { const std::wstring href = common_xlink_attlist_.href_.get_value_or(L""); Context.get_drawing_context().start_image(href); ////////////////////////////////////в принципе достаточно общая часть ... Context.get_text_context().start_drawing_content();//... если в объекте есть текст он привяжется к объекту - иначе к ячейке for (int i = 0 ; i < content_.size(); i++) { content_[i]->xlsx_convert(Context); } std::wstring text_content_ = Context.get_text_context().end_drawing_content(); if (text_content_.length()>0) { Context.get_drawing_context().set_property(_property(L"text-content",text_content_)); } ////////////////////////////////////////////////////////////////////////////3 раза уже повторилась Content -> Context Context.get_drawing_context().end_image(); }
void draw_connector::xlsx_convert(oox::xlsx_conversion_context & Context) { if (draw_connector_attlist_.draw_type_) { if (*draw_connector_attlist_.draw_type_ == L"curve") { sub_type_ = 11; } } reset_svg_attributes(); reset_svg_path(); /////////////////////////////////////////////////////////////////////// Context.get_drawing_context().start_shape(6); common_xlsx_convert(Context); Context.get_drawing_context().end_shape(); Context.get_drawing_context().clear(); }
void draw_object::xlsx_convert(oox::xlsx_conversion_context & Context) { try { const std::wstring href = common_xlink_attlist_.href_.get_value_or(L""); odf_reader::odf_document * odf_reader = Context.root(); std::wstring folderPath = odf_reader->get_folder(); std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href; // normalize path ???? todooo boost::algorithm::replace_all(objectPath, FILE_SEPARATOR_STR + std::wstring(L"./"), FILE_SEPARATOR_STR); cpdoccore::odf_reader::odf_document objectSubDoc(objectPath,NULL); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //в отдельных embd объектах чаще всего диаграммы... но МОГУТ быть и обычные объекты подтипа frame!!! пример RemanejamentoOrcamentario.ods /////////////////////////////////////////////////////////////////////////// //функциональная часть const office_element *contentSubDoc = objectSubDoc.get_impl()->get_content(); chart_build objectBuild; if (contentSubDoc) { process_build_chart process_build_object_(objectBuild, objectSubDoc.odf_context()); contentSubDoc->accept(process_build_object_); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //отображательная часть if (objectBuild.object_type_ == 1)//диаграмма { const std::wstring href_draw = common_xlink_attlist_.href_.get_value_or(L""); objectBuild.xlsx_convert(Context); Context.get_drawing_context().start_chart(href_draw); // в рисовательной части только место объекта, рамочки ... и релсы Context.get_drawing_context().end_chart(); } else if (objectBuild.object_type_ == 2)//текст (odt text) { Context.get_drawing_context().start_shape(2); Context.get_text_context().start_drawing_content(); //сменить контекст с главного на другой ... проблема со стилями!! Context.get_text_context().set_local_styles_container(&objectSubDoc.odf_context().styleContainer()); objectBuild.xlsx_convert(Context); std::wstring text_content_ = Context.get_text_context().end_drawing_content(); Context.get_text_context().set_local_styles_container(NULL);//вытираем вручную ... if (text_content_.length()>0) { Context.get_drawing_context().set_property(_property(L"text-content",text_content_)); } Context.get_drawing_context().end_shape(); } else { //временно - замещающая картинка(если она конечно присутствует) Context.get_drawing_context().set_use_image_replacement(); } } catch(...) { _CP_LOG << "[error] : convert draw::object error" << std::endl; } }
void dr3d_sphere::xlsx_convert(oox::xlsx_conversion_context & Context) { Context.get_drawing_context().start_shape(sub_type_); //reset type }
void draw_enhanced_geometry::xlsx_convert(oox::xlsx_conversion_context & Context) { find_draw_type_oox(); if (attlist_.draw_mirror_horizontal_) { Context.get_drawing_context().set_property(_property(L"flipH", *attlist_.draw_mirror_horizontal_)); } if (attlist_.draw_mirror_vertical_) { Context.get_drawing_context().set_property(_property(L"flipV", *attlist_.draw_mirror_vertical_)); } if (draw_type_oox_index_) { Context.get_drawing_context().set_property(_property(L"oox-geom-index", draw_type_oox_index_.get())); Context.get_drawing_context().set_property(_property(L"oox-geom", bOoxType_)); if (word_art_ == true) Context.get_drawing_context().set_property(_property(L"wordArt", true)); } if (sub_type_) { Context.get_drawing_context().start_shape(sub_type_.get()); } std::wstring odf_path; if (attlist_.drawooo_enhanced_path_) odf_path = attlist_.drawooo_enhanced_path_.get(); else if (attlist_.draw_enhanced_path_) odf_path = attlist_.draw_enhanced_path_.get(); if (!odf_path.empty()) { std::vector<::svg_path::_polyline> o_Polyline; bool res = false; bool bClosed = false; try { res = ::svg_path::parseSvgD(o_Polyline, odf_path, true, bClosed); } catch(...) { res = false; } //if (!bClosed) lined_shape_ = true; if (o_Polyline.size() > 1 && res ) { //сформируем xml-oox сдесь ... а то придется плодить массивы в drawing .. хоть и не красиво.. std::wstringstream output_; ::svg_path::oox_serialize(output_, o_Polyline); Context.get_drawing_context().set_property(odf_reader::_property(L"custom_path", output_.str())); if (attlist_.drawooo_sub_view_size_) { std::vector< std::wstring > splitted; boost::algorithm::split(splitted, *attlist_.drawooo_sub_view_size_, boost::algorithm::is_any_of(L" "), boost::algorithm::token_compress_on); if (splitted.size() == 2) { int w = boost::lexical_cast<int>(splitted[0]); int h = boost::lexical_cast<int>(splitted[1]); Context.get_drawing_context().set_property(odf_reader::_property(L"custom_path_w", w)); Context.get_drawing_context().set_property(odf_reader::_property(L"custom_path_h", h)); } else if (splitted.size() == 4) {///???? rect ??? int l = boost::lexical_cast<int>(splitted[0]); int t = boost::lexical_cast<int>(splitted[1]); int r = boost::lexical_cast<int>(splitted[2]); int b = boost::lexical_cast<int>(splitted[3]); } } } else if (!draw_type_oox_index_) { draw_type_oox_index_ = 0; } } if (attlist_.draw_modifiers_) { if (bOoxType_) Context.get_drawing_context().set_property(_property(L"oox-draw-modifiers", attlist_.draw_modifiers_.get())); else { } } }