{"id":11786,"date":"2025-11-05T16:28:15","date_gmt":"2025-11-05T16:28:15","guid":{"rendered":"https:\/\/www.sweethome3d.com\/huong-dan-cho-nha-phat-trien-plug-in\/"},"modified":"2025-12-19T10:19:46","modified_gmt":"2025-12-19T10:19:46","slug":"huong-dan-cho-nha-phat-trien-plug-in","status":"publish","type":"page","link":"https:\/\/www.sweethome3d.com\/vi\/huong-dan-cho-nha-phat-trien-plug-in\/","title":{"rendered":"H\u01b0\u1edbng d\u1eabn cho nh\u00e0 ph\u00e1t tri\u1ec3n plug-in"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Gi\u1edbi thi\u1ec7u<\/h2>\n\n<p>T\u1eeb phi\u00ean b\u1ea3n 1.5, c\u00f3 th\u1ec3 th\u00eam c\u00e1c t\u00ednh n\u0103ng m\u1edbi v\u00e0o <a href=\"\/\">Sweet Home 3D<\/a> v\u1edbi c\u00e1c t\u1ec7p plug-in \u0111\u1eb7t trong <a href=\"#deployingPlugin\">th\u01b0 m\u1ee5c plug-ins<\/a> c\u1ee7a b\u1ea1n. \u0110i\u1ec1u n\u00e0y cho ph\u00e9p c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean Java ph\u00e1t tri\u1ec3n v\u00e0 ph\u00e2n ph\u1ed1i c\u00e1c t\u00ednh n\u0103ng m\u1edbi cho <a href=\"https:\/\/www.sweethome3d.com\/vi\/\">Sweet Home 3D<\/a> m\u00e0 kh\u00f4ng c\u1ea7n s\u1eeda \u0111\u1ed5i c\u00e1c t\u1ec7p ngu\u1ed3n c\u1ee7a phi\u00ean b\u1ea3n hi\u1ec7n t\u1ea1i (\u0111i\u1ec1u n\u00e0y t\u1ed1t cho kh\u1ea3 n\u0103ng t\u01b0\u01a1ng th\u00edch l\u00ean tr\u00ean), v\u00e0 kh\u00f4ng c\u1ea7n cung c\u1ea5p m\u1ed9t phi\u00ean b\u1ea3n \u0111\u1ea7y \u0111\u1ee7 c\u1ee7a ch\u01b0\u01a1ng tr\u00ecnh (\u0111i\u1ec1u n\u00e0y t\u1ed1t cho k\u00edch th\u01b0\u1edbc ph\u00e2n ph\u1ed1i).<br\/>T\u00e0i li\u1ec7u n\u00e0y m\u00f4 t\u1ea3 c\u00e1c <a href=\"#installingTools\" data-type=\"internal\" data-id=\"#installingTools\">c\u00f4ng c\u1ee5<\/a> c\u1ea7n thi\u1ebft \u0111\u1ec3 t\u1ea1o plug-in, sau \u0111\u00f3 ch\u1ec9 ra c\u00e1ch <a href=\"#programmingPlugin\">l\u1eadp tr\u00ecnh m\u1ed9t plug-in<\/a> t\u00ednh to\u00e1n th\u1ec3 t\u00edch t\u1ed1i \u0111a c\u1ee7a \u0111\u1ed3 n\u1ed9i th\u1ea5t c\u00f3 th\u1ec3 di chuy\u1ec3n \u0111\u01b0\u1ee3c th\u00eam v\u00e0o nh\u00e0, v\u00e0 cu\u1ed1i c\u00f9ng cung c\u1ea5p m\u1ed9t s\u1ed1 <a href=\"#goingFurther\">th\u00f4ng tin b\u1ed5 sung<\/a> s\u1ebd gi\u00fap b\u1ea1n ti\u1ebfn xa h\u01a1n. <\/p>\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n<h2 class=\"wp-block-heading\" id=\"installingTools\">C\u00e0i \u0111\u1eb7t c\u00f4ng c\u1ee5 ph\u00e1t tri\u1ec3n<\/h2>\n\n<p>N\u1ebfu Sweet Home 3D h\u01b0\u1edbng \u0111\u1ebfn \u0111\u1ed1i t\u01b0\u1ee3ng chung, ph\u00e1t tri\u1ec3n plug-in \u0111\u00f2i h\u1ecfi k\u1ef9 n\u0103ng \u0111\u1eb7c bi\u1ec7t, v\u00e0 b\u1ea1n n\u00ean bi\u1ebft c\u00e1ch l\u1eadp tr\u00ecnh trong <a href=\"https:\/\/java.sun.com\" target=\"_blank\" rel=\"noopener\">Java<\/a> v\u1edbi m\u1ed9t IDE<a href=\"https:\/\/ant.apache.org\/\" target=\"_blank\" rel=\"noopener\"><\/a> tr\u01b0\u1edbc khi ti\u1ebfn xa h\u01a1n. H\u01b0\u1edbng d\u1eabn n\u00e0y ch\u1ec9 ra c\u00e1ch x\u00e2y d\u1ef1ng m\u1ed9t plug-in v\u1edbi <a href=\"https:\/\/www.eclipse.org\/\" target=\"_blank\" rel=\"noopener\">Eclipse<\/a>, nh\u01b0ng b\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng IDE m\u00e0 b\u1ea1n ch\u1ecdn, ho\u1eb7c kh\u00f4ng c\u1ea7n IDE n\u00e0o c\u1ea3. <\/p>\n\n<h3 class=\"wp-block-heading\">T\u1ea3i xu\u1ed1ng v\u00e0 c\u00e0i \u0111\u1eb7t Eclipse<\/h3>\n\n<p>Tr\u01b0\u1edbc ti\u00ean, t\u1ea3i xu\u1ed1ng Eclipse t\u1eeb <a href=\"https:\/\/www.eclipse.org\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.eclipse.org\/<\/a>. Phi\u00ean b\u1ea3n c\u00f3 t\u00ean <em>Eclipse IDE for Java Developers<\/em> l\u00e0 \u0111\u1ee7 \u0111\u1ec3 ph\u00e1t tri\u1ec3n m\u1ed9t plug-in, nh\u01b0ng b\u1ea1n c\u00f3 th\u1ec3 t\u1ea3i xu\u1ed1ng b\u1ea5t k\u1ef3 phi\u00ean b\u1ea3n n\u00e0o cho ph\u00e1t tri\u1ec3n Java. <br\/>Sau khi t\u1ea3i xu\u1ed1ng, c\u00e0i \u0111\u1eb7t Eclipse r\u1ea5t \u0111\u01a1n gi\u1ea3n: ch\u1ec9 c\u1ea7n gi\u1ea3i n\u00e9n t\u1ec7p l\u01b0u tr\u1eef b\u1ea1n s\u1ebd nh\u1eadn \u0111\u01b0\u1ee3c, m\u1edf th\u01b0 m\u1ee5c eclipse v\u00e0 t\u00f9y thu\u1ed9c v\u00e0o h\u1ec7 th\u1ed1ng c\u1ee7a b\u1ea1n, ch\u1ea1y t\u1ec7p c\u00f3 t\u00ean <code>eclipse.exe<\/code> (tr\u00ean Windows), <code>eclipse.app<\/code> (tr\u00ean Mac OS X) ho\u1eb7c <code>eclipse<\/code> (tr\u00ean Linux).<br\/>L\u1ea7n \u0111\u1ea7u ti\u00ean ch\u1ea1y, Eclipse s\u1ebd y\u00eau c\u1ea7u b\u1ea1n ch\u1ecdn m\u1ed9t th\u01b0 m\u1ee5c <em>workspace<\/em>, n\u01a1i s\u1ebd l\u01b0u tr\u1eef c\u00e1c d\u1ef1 \u00e1n plug-in.<br\/>Sau khi ho\u00e0n t\u1ea5t, ch\u1ecdn <em>File &gt; New &gt; Project<\/em> t\u1eeb menu \u0111\u1ec3 t\u1ea1o m\u1ed9t d\u1ef1 \u00e1n m\u1edbi, ch\u1ecdn <em>Java &gt; Java project<\/em> trong tr\u00ecnh h\u01b0\u1edbng d\u1eabn <em>New project<\/em> s\u1ebd \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb, nh\u1eadp VolumePlugin l\u00e0m t\u00ean d\u1ef1 \u00e1n v\u00e0 nh\u1ea5p v\u00e0o n\u00fat <em>Finish<\/em>. Cu\u1ed1i c\u00f9ng, \u0111\u00f3ng tab <em>Welcome<\/em> \u0111\u1ec3 kh\u00e1m ph\u00e1 workspace c\u1ee7a b\u1ea1n nh\u01b0 \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb trong h\u00ecnh 1. <\/p>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"388\" height=\"315\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipse.png\" alt=\"\" class=\"wp-image-5845 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipse.png 388w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipse-300x244.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipse-111x90.png 111w\" data-sizes=\"(max-width: 388px) 100vw, 388px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 388px; --smush-placeholder-aspect-ratio: 388\/315;\" \/><figcaption class=\"wp-element-caption\">H\u00ecnh 1. Kh\u00f4ng gian l\u00e0m vi\u1ec7c c\u1ee7a Eclipse <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\">T\u1ea3i xu\u1ed1ng v\u00e0 c\u00e0i \u0111\u1eb7t th\u01b0 vi\u1ec7n Sweet Home 3D<\/h3>\n\n<p>Vi\u1ec7c ph\u00e1t tri\u1ec3n m\u1ed9t plug-in d\u1ef1a tr\u00ean m\u1ed9t s\u1ed1 l\u1edbp c\u1ee7a Sweet Home 3D m\u00e0 Eclipse ph\u1ea3i bi\u1ebft \u0111\u1ec3 c\u00f3 th\u1ec3 x\u00e2y d\u1ef1ng d\u1ef1 \u00e1n c\u1ee7a b\u1ea1n. C\u00e1ch d\u1ec5 nh\u1ea5t \u0111\u1ec3 th\u00eam c\u00e1c l\u1edbp Sweet Home 3D v\u00e0o Eclipse l\u00e0 t\u1ea3i xu\u1ed1ng phi\u00ean b\u1ea3n JAR th\u1ef1c thi c\u1ee7a Sweet Home 3D c\u00f3 s\u1eb5n t\u1ea1i <a href=\"https:\/\/sourceforge.net\/projects\/sweethome3d\/files\/SweetHome3D\/SweetHome3D-7.5\/SweetHome3D-7.5.jar\/download\" target=\"_blank\" rel=\"noopener\">https:\/\/sourceforge.net\/projects\/sweethome3d\/files\/SweetHome3D\/SweetHome3D-7.5\/SweetHome3D-7.5.jar\/download<\/a>. Sau khi t\u1ea3i xu\u1ed1ng, k\u00e9o v\u00e0 th\u1ea3 t\u1ec7p SweetHome3D-7.5.jar v\u00e0o bi\u1ec3u t\u01b0\u1ee3ng d\u1ef1 \u00e1n <em>VolumePlugin<\/em> trong ch\u1ebf \u0111\u1ed9 xem <em>Package Explorer<\/em> c\u1ee7a Eclipse, v\u00e0 ch\u1ecdn m\u1ee5c <em>Build Path &gt; Add to Build Path<\/em> trong menu ng\u1eef c\u1ea3nh c\u1ee7a t\u1ec7p SweetHome3D-7.5.jar, nh\u01b0 \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb trong h\u00ecnh 2.  <\/p>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"452\" height=\"157\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/addToBuildPath.png\" alt=\"\" class=\"wp-image-5846 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/addToBuildPath.png 452w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/addToBuildPath-300x104.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/addToBuildPath-259x90.png 259w\" data-sizes=\"(max-width: 452px) 100vw, 452px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 452px; --smush-placeholder-aspect-ratio: 452\/157;\" \/><figcaption class=\"wp-element-caption\">H\u00ecnh 2. Th\u00eam SweetHome3D-7.5.jar<br\/> v\u00e0o Build Path <\/figcaption><\/figure>\n<\/div>\n\n<h2 class=\"wp-block-heading programmingPlugin\">L\u1eadp tr\u00ecnh m\u1ed9t plug-in<\/h2>\n\n<p>B\u00e2y gi\u1edd b\u1ea1n \u0111\u00e3 c\u00e0i \u0111\u1eb7t c\u00e1c c\u00f4ng c\u1ee5 c\u1ea7n thi\u1ebft, h\u00e3y xem c\u00e1ch b\u1ea1n c\u00f3 th\u1ec3 l\u1eadp tr\u00ecnh plug-in \u0111\u1ea7u ti\u00ean c\u1ee7a m\u00ecnh cho Sweet Home 3D.<\/p>\n\n<h3 class=\"wp-block-heading\">T\u1ea1o l\u1edbp plug-in<\/h3>\n\n<p>\u0110\u1ea7u ti\u00ean, t\u1ea1o m\u1ed9t l\u1edbp con m\u1edbi c\u1ee7a com.eteks.sweethome3d.plugin.Plugin b\u1eb1ng c\u00e1ch ch\u1ecdn m\u1ee5c menu <em>File &gt; New &gt; Class<\/em> trong Eclipse.<\/p>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"418\" height=\"509\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newJavaClass.png\" alt=\"\" class=\"wp-image-5847 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newJavaClass.png 418w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newJavaClass-246x300.png 246w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newJavaClass-74x90.png 74w\" data-sizes=\"(max-width: 418px) 100vw, 418px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 418px; --smush-placeholder-aspect-ratio: 418\/509;\" \/><figcaption class=\"wp-element-caption\">H\u00ecnh 3. T\u1ea1o m\u1ed9t l\u1edbp m\u1edbi <\/figcaption><\/figure>\n<\/div>\n\n<p>Trong h\u1ed9p tho\u1ea1i <em>New Java Class<\/em>, nh\u1eadp VolumePlugin l\u00e0m t\u00ean l\u1edbp, nh\u1eadp m\u1ed9t g\u00f3i (\u1edf \u0111\u00e2y g\u00f3i \u0111\u01b0\u1ee3c ch\u1ecdn l\u00e0 com.eteks.test), v\u00e0 ch\u1ecdn com.eteks.sweethome3d.plugin.Plugin l\u00e0m l\u1edbp cha c\u1ee7a VolumePlugin. Sau khi ho\u00e0n t\u1ea5t, nh\u1ea5p v\u00e0o <em>Finish<\/em>. Eclipse s\u1ebd t\u1ea1o t\u1ec7p c\u1ee7a l\u1edbp m\u1edbi v\u1edbi n\u1ed9i dung sau:  <\/p>\n\n<pre class=\"wp-block-preformatted\">package com.eteks.test;<br\/>import com.eteks.sweethome3d.plugin.Plugin;<br\/>import com.eteks.sweethome3d.plugin.PluginAction;<br\/>public class <strong>VolumePlugin<\/strong> extends <strong>Plugin<\/strong> {<br\/> @Override<br\/> public PluginAction[] <strong>getActions<\/strong>() {<br\/> \/\/ TODO Auto-generated method stub<br\/> return null;<br\/> }<br\/>}<\/pre>\n\n<p>Nh\u01b0 b\u1ea1n c\u00f3 th\u1ec3 \u0111o\u00e1n t\u1eeb nh\u1eadn x\u00e9t TODO, b\u1ea1n ph\u1ea3i thay \u0111\u1ed5i vi\u1ec7c tri\u1ec3n khai ph\u01b0\u01a1ng th\u1ee9c getActions \u0111\u1ec3 tr\u1ea3 v\u1ec1 m\u1ed9t h\u00e0nh \u0111\u1ed9ng plug-in c\u00f3 th\u1ec3 t\u00ednh to\u00e1n th\u1ec3 t\u00edch c\u1ee7a \u0111\u1ed3 n\u1ed9i th\u1ea5t c\u00f3 th\u1ec3 di chuy\u1ec3n. Thay th\u1ebf return null; b\u1eb1ng c\u00e2u l\u1ec7nh sau: <\/p>\n\n<pre class=\"wp-block-preformatted\"> return new <strong>PluginAction<\/strong> [] {new <strong>VolumeAction<\/strong>()}; <\/pre>\n\n<p>v\u00e0 ch\u1ecdn <em>Edition &gt; Quick Fix<\/em> t\u1eeb menu Eclipse \u0111\u1ec3 t\u1ea1o l\u1edbp VolumeAction b\u1ecb thi\u1ebfu, nh\u01b0 \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb trong h\u00ecnh 4.<\/p>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"615\" height=\"117\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/quickFix.png\" alt=\"\" class=\"wp-image-5848 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/quickFix.png 615w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/quickFix-300x57.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/quickFix-473x90.png 473w\" data-sizes=\"(max-width: 615px) 100vw, 615px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 615px; --smush-placeholder-aspect-ratio: 615\/117;\" \/><figcaption class=\"wp-element-caption\">H\u00ecnh 4. S\u1eed d\u1ee5ng Quick fix \u0111\u1ec3 t\u1ea1o m\u1ed9t l\u1edbp b\u1ecb thi\u1ebfu <\/figcaption><\/figure>\n<\/div>\n\n<p>Trong h\u1ed9p tho\u1ea1i <em>New Java Class<\/em> xu\u1ea5t hi\u1ec7n, ch\u1ecdn h\u1ed9p ki\u1ec3m <em>Enclosing type<\/em> \u0111\u1ec3 t\u1ea1o m\u1ed9t l\u1edbp b\u00ean trong c\u1ee7a VolumePlugin v\u00e0 nh\u1ea5p v\u00e0o <em>Finish<\/em>. \u0110i\u1ec1u n\u00e0y s\u1ebd t\u1ea1o l\u1edbp VolumeAction k\u1ebf th\u1eeba t\u1eeb l\u1edbp com.eteks.sweethome3d.plugin.PluginAction v\u00e0 ch\u1ee9a m\u1ed9t ph\u01b0\u01a1ng th\u1ee9c execute tr\u1ed1ng: <\/p>\n\n<pre class=\"wp-block-preformatted\"> public class <strong>VolumeAction<\/strong> extends <strong>PluginAction<\/strong> {<br\/> @Override<br\/> public void <strong>execute<\/strong>() {<br\/> \/\/ TODO Auto-generated method stub<br\/> }<br\/>}<\/pre>\n\n<p>Ph\u01b0\u01a1ng th\u1ee9c n\u00e0y l\u00e0 ph\u01b0\u01a1ng th\u1ee9c m\u00e0 Sweet Home 3D s\u1ebd g\u1ecdi khi ng\u01b0\u1eddi d\u00f9ng kh\u1edfi ch\u1ea1y h\u00e0nh \u0111\u1ed9ng plug-in; do \u0111\u00f3 \u0111\u00e2y l\u00e0 n\u01a1i b\u1ea1n ph\u1ea3i tri\u1ec3n khai c\u00e1ch t\u00ednh to\u00e1n th\u1ec3 t\u00edch c\u1ee7a \u0111\u1ed3 n\u1ed9i th\u1ea5t v\u00e0 hi\u1ec3n th\u1ecb n\u00f3:<\/p>\n\n<pre class=\"wp-block-preformatted\"> public class <strong>VolumeAction<\/strong> extends <strong>PluginAction<\/strong> {  <br\/> @Override<br\/> public void <strong>execute<\/strong>() { <br\/> float volumeInCm3 = 0;<br\/> \/\/ T\u00ednh t\u1ed5ng th\u1ec3 t\u00edch c\u1ee7a h\u1ed9p bao quanh c\u1ee7a <br\/> \/\/ m\u1ed7i m\u1ea3nh \u0111\u1ed3 n\u1ed9i th\u1ea5t c\u00f3 th\u1ec3 di chuy\u1ec3n trong nh\u00e0<br\/> for (PieceOfFurniture piece : <strong>getHome<\/strong>(). <strong>getFurniture<\/strong>()) {<br\/> if (piece. <strong>isMovable<\/strong>()) {<br\/> volumeInCm3 += piece. <strong>getWidth<\/strong>() <br\/> * piece. <strong>getDepth<\/strong>() <br\/> * piece. <strong>getHeight<\/strong>();<br\/> }<br\/>}<br\/> \/\/ Hi\u1ec3n th\u1ecb k\u1ebft qu\u1ea3 trong m\u1ed9t h\u1ed9p th\u00f4ng b\u00e1o (\u00b3 l\u00e0 s\u1ed1 3 \u1edf d\u1ea1ng si\u00eau k\u00fd t\u1ef1)<br\/> String message = String. <strong>format<\/strong>(<br\/> \"Th\u1ec3 t\u00edch t\u1ed1i \u0111a c\u1ee7a \u0111\u1ed3 n\u1ed9i th\u1ea5t c\u00f3 th\u1ec3 di chuy\u1ec3n trong nh\u00e0 l\u00e0 %.2f m\u00b3.\", <br\/> volumeInCm3 \/ 1000000);<br\/> JOptionPane. <strong>showMessageDialog<\/strong>(null, message);<br\/>  }<br\/>  }<\/pre>\n\n<p>B\u00e2y gi\u1edd b\u1ea1n \u0111\u00e3 x\u00e1c \u0111\u1ecbnh nh\u1eefng g\u00ec b\u1ea1n mu\u1ed1n plug-in th\u1ef1c hi\u1ec7n, b\u1ea1n ph\u1ea3i m\u00f4 t\u1ea3 c\u00e1ch ng\u01b0\u1eddi d\u00f9ng s\u1ebd kh\u1edfi ch\u1ea1y h\u00e0nh \u0111\u1ed9ng m\u1edbi n\u00e0y. B\u1ea1n c\u00f3 th\u1ec3 ch\u1ecdn th\u00eam m\u1ed9t <strong>m\u1ee5c menu<\/strong> m\u1edbi v\u00e0o m\u1ed9t menu, v\u00e0\/ho\u1eb7c m\u1ed9t <strong>n\u00fat<\/strong> m\u1edbi v\u00e0o thanh c\u00f4ng c\u1ee5. L\u1ef1a ch\u1ecdn n\u00e0y \u0111\u01b0\u1ee3c th\u1ef1c hi\u1ec7n b\u1eb1ng c\u00e1ch thi\u1ebft l\u1eadp c\u00e1c thu\u1ed9c t\u00ednh th\u00edch h\u1ee3p c\u1ee7a h\u00e0nh \u0111\u1ed9ng plug-in khi t\u1ea1o ra n\u00f3. V\u00ed d\u1ee5, n\u1ebfu b\u1ea1n mu\u1ed1n ng\u01b0\u1eddi d\u00f9ng kh\u1edfi ch\u1ea1y h\u00e0nh \u0111\u1ed9ng th\u1ec3 t\u00edch v\u1edbi m\u1ee5c menu <em>Compute volume<\/em> \u0111\u01b0\u1ee3c t\u00ecm th\u1ea5y trong menu <em>Tools<\/em>, b\u1ea1n s\u1ebd th\u00eam h\u00e0m t\u1ea1o sau v\u00e0o l\u1edbp VolumnAction:   <\/p>\n\n<pre class=\"wp-block-preformatted\"> public <strong>VolumeAction<\/strong>() {<br\/> <strong>putPropertyValue<\/strong>(Property.NAME, \"Compute volume\");<br\/> <strong>putPropertyValue<\/strong>(Property.MENU, \"Tools\");<br\/> \/\/ K\u00edch ho\u1ea1t h\u00e0nh \u0111\u1ed9ng theo m\u1eb7c \u0111\u1ecbnh<br\/> <strong>setEnabled<\/strong>(true);<br\/>}<\/pre>\n\n<p>L\u1edbp plug-in <a href=\"\/examples\/VolumePlugin\/VolumePlugin.java\">VolumePlugin<\/a> b\u00e2y gi\u1edd \u0111\u00e3 \u0111\u01b0\u1ee3c l\u1eadp tr\u00ecnh, v\u00e0 g\u1ea7n nh\u01b0 s\u1eb5n s\u00e0ng ho\u1ea1t \u0111\u1ed9ng nh\u01b0 m\u1ed9t plug-in trong Sweet Home 3D. Hai \u0111i\u1ec1u cu\u1ed1i c\u00f9ng c\u1ea7n l\u00e0m l\u00e0: <\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li>t\u1ea1o m\u1ed9t t\u1ec7p m\u00f4 t\u1ea3 <tt>ApplicationPlugin.properties<\/tt>,<\/li>\n\n\n\n<li>\u0111\u1eb7t c\u00e1c t\u1ec7p l\u1ea1i v\u1edbi nhau trong m\u1ed9t t\u1ec7p JAR.<br\/><\/li>\n<\/ul>\n\n<h3 class=\"wp-block-heading\" id=\"creating-the-plugin-description-file\">T\u1ea1o t\u1ec7p m\u00f4 t\u1ea3 plug-in<\/h3>\n\n<p>M\u1ed9t t\u1ec7p <tt>ApplicationPlugin.properties<\/tt>\n m\u00f4 t\u1ea3 t\u00ean plug-in, l\u1edbp c\u1ee7a n\u00f3, c\u00e1c phi\u00ean b\u1ea3n t\u1ed1i thi\u1ec3u c\u1ee7a Sweet Home 3D v\u00e0 Java m\u00e0 n\u00f3 \u0111\u01b0\u1ee3c h\u1ed7 tr\u1ee3,\n v\u00e0 c\u00e1c v\u1ea5n \u0111\u1ec1 ph\u00e1p l\u00fd. Ch\u1ecdn <i>File &gt; New &gt; File<\/i> t\u1eeb\n menu Eclipse, nh\u1eadp t\u00ean t\u1ec7p <tt>ApplicationPlugin.properties<\/tt> v\u00e0 nh\u1ea5p v\u00e0o <i>Finish<\/i>, nh\u01b0 \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb\n trong h\u00ecnh 5. <\/p>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img decoding=\"async\" width=\"264\" height=\"384\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newFile.png\" alt=\"\" class=\"wp-image-5849 lazyload\" style=\"--smush-placeholder-width: 264px; --smush-placeholder-aspect-ratio: 264\/384;width:264px;height:auto\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newFile.png 264w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newFile-206x300.png 206w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newFile-62x90.png 62w\" data-sizes=\"(max-width: 264px) 100vw, 264px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><figcaption class=\"wp-element-caption\">H\u00ecnh 5. T\u1ea1o m\u1ed9t t\u1ec7p m\u1edbi <\/figcaption><\/figure>\n<\/div>\n\n<p>Sau \u0111\u00f3 nh\u1eadp <a href=\"\/examples\/VolumePlugin\/ApplicationPlugin.properties\">m\u00f4 t\u1ea3 sau<\/a> v\u00e0o t\u1ec7p m\u1edbi v\u00e0 l\u01b0u l\u1ea1i:<\/p>\n\n<pre class=\"wp-block-preformatted\"><strong>name<\/strong>=Th\u1ec3 t\u00edch \u0111\u1ed3 n\u1ed9i th\u1ea5t c\u00f3 th\u1ec3 di chuy\u1ec3n<br\/><strong>class<\/strong>=com.eteks.test.VolumePlugin<br\/><strong>description<\/strong>=T\u00ednh to\u00e1n th\u1ec3 t\u00edch c\u1ee7a \u0111\u1ed3 n\u1ed9i th\u1ea5t c\u00f3 th\u1ec3 di chuy\u1ec3n trong nh\u00e0<br\/><strong>version<\/strong>=1.0<br\/><strong>license<\/strong>=GNU GPL<br\/><strong>provider<\/strong>=(C) B\u1ea3n quy\u1ec1n 2024 Space Mushrooms<br\/><strong>applicationMinimumVersion<\/strong>=1.5<br\/><strong>javaMinimumVersion<\/strong>=1.5<\/pre>\n\n<h3 class=\"wp-block-heading\" id=\"creatingPluginJAR\">T\u1ea1o t\u1ec7p JAR plug-in<\/h3>\n\n<p>T\u1ec7p JAR plug-in ch\u1ee9a c\u00e1c t\u1ec7p <tt>class<\/tt> \u0111\u01b0\u1ee3c t\u1ea1o t\u1eeb vi\u1ec7c bi\u00ean d\u1ecbch t\u1ec7p <tt>VolumePlugin.java<\/tt>,\n v\u00e0 t\u1ec7p <tt>ApplicationPlugin.properties<\/tt>. V\u00ec Eclipse bi\u00ean d\u1ecbch m\u1ed9t t\u1ec7p Java ngay khi b\u1ea1n l\u01b0u n\u00f3, b\u1ea1n\n ch\u1ec9 c\u1ea7n ch\u1ecdn <i>File &gt; Export&#8230;<\/i> t\u1eeb menu v\u00e0 ch\u1ecdn <i>Java &gt; JAR file<\/i> trong h\u1ed9p tho\u1ea1i <i>Export<\/i>\n s\u1ebd \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb. Trong tr\u00ecnh h\u01b0\u1edbng d\u1eabn <i>Jar Export<\/i> xu\u1ea5t hi\u1ec7n nh\u01b0 \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb trong h\u00ecnh 6, ch\u1ecdn h\u1ed9p ki\u1ec3m d\u1ef1 \u00e1n\n v\u00e0 nh\u1eadp \u0111\u01b0\u1eddng d\u1eabn c\u1ee7a m\u1ed9t t\u1ec7p JAR \u0111\u1eb7t trong th\u01b0 m\u1ee5c plug-ins c\u1ee7a Sweet Home 3D. Th\u01b0 m\u1ee5c th\u00edch h\u1ee3p n\u00e0y ph\u1ee5 thu\u1ed9c\n v\u00e0o h\u1ec7 th\u1ed1ng c\u1ee7a b\u1ea1n nh\u01b0 sau:   <\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li> tr\u00ean Windows Vista \/ 7 \/ 8 \/ 10 \/ 11, th\u01b0 m\u1ee5c n\u00e0y l\u00e0 <tt>C:\\Users\\<i>user<\/i>\\AppData\\Roaming\\eTeks\\Sweet\n Home 3D\\plugins<\/tt>,<\/li>\n\n\n\n<li> tr\u00ean Windows XP v\u00e0 c\u00e1c phi\u00ean b\u1ea3n Windows tr\u01b0\u1edbc \u0111\u00f3, th\u01b0 m\u1ee5c n\u00e0y l\u00e0 <tt>C:\\Documents and Settings\\<i>user<\/i>\\Application Data\\eTeks\\Sweet\n Home 3D\\plugins<\/tt>,<\/li>\n\n\n\n<li> tr\u00ean macOS, n\u00f3 l\u00e0 th\u01b0 m\u1ee5c con <tt>Library\/Application Support\/eTeks\/Sweet Home 3D\/<\/tt><tt>plugins<\/tt> c\u1ee7a th\u01b0 m\u1ee5c ng\u01b0\u1eddi d\u00f9ng c\u1ee7a b\u1ea1n,\n<\/li>\n\n\n\n<li> tr\u00ean Linux v\u00e0 c\u00e1c Unix kh\u00e1c, n\u00f3 l\u00e0 th\u01b0 m\u1ee5c con <tt>.eteks\/sweethome3d\/<\/tt><tt>plugins<\/tt> c\u1ee7a th\u01b0 m\u1ee5c ng\u01b0\u1eddi d\u00f9ng c\u1ee7a b\u1ea1n.<\/li>\n<\/ul>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"499\" height=\"440\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/jarExport.png\" alt=\"\" class=\"wp-image-5850 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/jarExport.png 499w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/jarExport-300x265.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/jarExport-102x90.png 102w\" data-sizes=\"(max-width: 499px) 100vw, 499px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 499px; --smush-placeholder-aspect-ratio: 499\/440;\" \/><figcaption class=\"wp-element-caption\">H\u00ecnh 6. Xu\u1ea5t sang t\u1ec7p JAR <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\" id=\"testing-the-plugin\">Ki\u1ec3m tra plug-in<\/h3>\n\n<p>Plug-in b\u1ea1n ph\u00e1t tri\u1ec3n s\u1ebd ch\u1ea1y trong Sweet Home 3D, ho\u1eb7c v\u1edbi phi\u00ean b\u1ea3n <a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">plug-in<\/a>, phi\u00ean b\u1ea3n <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>, ho\u1eb7c phi\u00ean b\u1ea3n <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" target=\"_blank\" rel=\"noopener\">installers<\/a> ho\u1eb7c <a href=\"https:\/\/sourceforge.net\/projects\/sweethome3d\/files\/SweetHome3D\/SweetHome3D-7.5\/SweetHome3D-7.5.jar\/download\" target=\"_blank\" rel=\"noopener\">SweetHome3D-7.5.jar<\/a> b\u1ea1n \u0111\u00e3 t\u1ea3i xu\u1ed1ng tr\u01b0\u1edbc \u0111\u00f3. V\u00ec c\u00e1i cu\u1ed1i c\u00f9ng l\u00e0 m\u1ed9t JAR th\u1ef1c thi, b\u1ea1n c\u00f3 th\u1ec3 ch\u1ea1y n\u00f3 b\u1eb1ng c\u00e1ch nh\u1ea5p \u0111\u00fap v\u00e0o n\u00f3 ho\u1eb7c v\u1edbi l\u1ec7nh sau: <\/p>\n\n<p>Plug-in b\u1ea1n ph\u00e1t tri\u1ec3n s\u1ebd ch\u1ea1y trong Sweet Home 3D, ho\u1eb7c v\u1edbi phi\u00ean b\u1ea3n <a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">plug-in<\/a>, phi\u00ean b\u1ea3n <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>, ho\u1eb7c phi\u00ean b\u1ea3n <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" target=\"_blank\" rel=\"noopener\">installers<\/a> ho\u1eb7c <a href=\"https:\/\/sourceforge.net\/projects\/sweethome3d\/files\/SweetHome3D\/SweetHome3D-7.5\/SweetHome3D-7.5.jar\/download\" target=\"_blank\" rel=\"noopener\">SweetHome3D-7.5.jar<\/a> b\u1ea1n \u0111\u00e3 t\u1ea3i xu\u1ed1ng tr\u01b0\u1edbc \u0111\u00f3. V\u00ec c\u00e1i cu\u1ed1i c\u00f9ng l\u00e0 m\u1ed9t JAR th\u1ef1c thi, b\u1ea1n c\u00f3 th\u1ec3 ch\u1ea1y n\u00f3 b\u1eb1ng c\u00e1ch nh\u1ea5p \u0111\u00fap v\u00e0o n\u00f3 ho\u1eb7c v\u1edbi l\u1ec7nh sau: <\/p>\n\n<pre class=\"wp-block-preformatted\">java -jar \/<em>path<\/em>\/<em>to<\/em>\/SweetHome3D-7.5.jar<\/pre>\n\n<p>Mi\u1ec5n l\u00e0 b\u1ea1n \u0111ang th\u1eed nghi\u1ec7m, b\u1ea1n c\u00f3 th\u1ec3 th\u00edch ch\u1ea1y Sweet Home 3D v\u1edbi l\u1ec7nh n\u00e0y, \u0111\u1ec3 c\u00f3 th\u1ec3 \u0111\u1ecdc trong b\u1ea3ng \u0111i\u1ec1u khi\u1ec3n d\u1ea5u v\u1ebft ng\u0103n x\u1ebfp c\u1ee7a c\u00e1c ngo\u1ea1i l\u1ec7 \u0111\u01b0\u1ee3c n\u00e9m ra trong qu\u00e1 tr\u00ecnh th\u1ef1c thi plug-in c\u1ee7a b\u1ea1n.<\/p>\n\n<p>Khi Sweet Home 3D \u0111\u01b0\u1ee3c kh\u1edfi ch\u1ea1y, b\u1ea1n s\u1ebd th\u1ea5y menu m\u1edbi v\u00e0 m\u1ee5c c\u1ee7a n\u00f3 xu\u1ea5t hi\u1ec7n nh\u01b0 \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb trong h\u00ecnh 7:<\/p>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"447\" height=\"53\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginMenu.png\" alt=\"\" class=\"wp-image-5851 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginMenu.png 447w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginMenu-300x36.png 300w\" data-sizes=\"(max-width: 447px) 100vw, 447px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 447px; --smush-placeholder-aspect-ratio: 447\/53;\" \/><figcaption class=\"wp-element-caption\">H\u00ecnh 7. Menu plug-in <\/figcaption><\/figure>\n<\/div>\n\n<p>N\u1ebfu b\u1ea1n ch\u1ecdn m\u1ee5c menu m\u1edbi cho <a href=\"\/examples\/userGuideExample.sh3d\">v\u00ed d\u1ee5 nh\u00e0<\/a> \u0111\u01b0\u1ee3c t\u1ea1o trong <a href=\"https:\/\/www.sweethome3d.com\/vi\/huong-dan-su-dung-sweet-home-3d\/\" data-type=\"page\" data-id=\"424\">h\u01b0\u1edbng d\u1eabn ng\u01b0\u1eddi d\u00f9ng<\/a>, b\u1ea1n s\u1ebd nh\u1eadn \u0111\u01b0\u1ee3c k\u1ebft qu\u1ea3 sau:<\/p>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"448\" height=\"137\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginInAction.png\" alt=\"\" class=\"wp-image-5853 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginInAction.png 448w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginInAction-300x92.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginInAction-294x90.png 294w\" data-sizes=\"(max-width: 448px) 100vw, 448px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 448px; --smush-placeholder-aspect-ratio: 448\/137;\" \/><figcaption class=\"wp-element-caption\">H\u00ecnh 8. Plug-in \u0111ang ho\u1ea1t \u0111\u1ed9ng <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\">G\u1ee1 l\u1ed7i plug-in<\/h3>\n\n<p>N\u1ebfu b\u1ea1n c\u1ea7n g\u1ee1 l\u1ed7i plug-in c\u1ee7a m\u00ecnh t\u1eeb Eclipse, h\u00e3y t\u1ea1o m\u1ed9t c\u1ea5u h\u00ecnh g\u1ee1 l\u1ed7i b\u1eb1ng c\u00e1ch l\u00e0m theo c\u00e1c b\u01b0\u1edbc sau:<\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Ch\u1ecdn <i>Run &gt; Debug Configurations&#8230;<\/i> t\u1eeb menu, ch\u1ecdn m\u1ee5c <i>Java Application<\/i> trong danh s\u00e1ch c\u1ea5u h\u00ecnh c\u00f3 s\u1eb5n c\u1ee7a h\u1ed9p tho\u1ea1i \n <i>Debug configurations<\/i>, nh\u1ea5p v\u00e0o n\u00fat <i>New <\/i>\u1edf g\u00f3c tr\u00ean b\u00ean tr\u00e1i v\u00e0 nh\u1eadp t\u00ean cho c\u1ea5u h\u00ecnh.<\/li>\n\n\n\n<li>Nh\u1ea5p v\u00e0o n\u00fat <i>Search&#8230;<\/i> \u1edf b\u00ean ph\u1ea3i tr\u01b0\u1eddng v\u0103n b\u1ea3n <i>Main class<\/i> v\u00e0 nh\u1ea5p \u0111\u00fap v\u00e0o l\u1edbp <i>SweetHome3DBootstrap<\/i> <br\/> trong s\u1ed1 c\u00e1c l\u1edbp \u0111\u01b0\u1ee3c \u0111\u1ec1 xu\u1ea5t.<\/li>\n<\/ul>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"629\" height=\"390\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/debugConfiguration.png\" alt=\"\" class=\"wp-image-5854 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/debugConfiguration.png 629w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/debugConfiguration-300x186.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/debugConfiguration-145x90.png 145w\" data-sizes=\"(max-width: 629px) 100vw, 629px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 629px; --smush-placeholder-aspect-ratio: 629\/390;\" \/><figcaption class=\"wp-element-caption\"><em>H\u00ecnh 9. T\u1ea1o m\u1ed9t c\u1ea5u h\u00ecnh g\u1ee1 l\u1ed7i <\/em><\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Nh\u1ea5p v\u00e0o tab <em>Classpath<\/em>, ch\u1ecdn m\u1ee5c con <em>VolumePlugin (classpath m\u1eb7c \u0111\u1ecbnh)<\/em> c\u1ee7a m\u1ee5c <em>User Entries<\/em> trong danh s\u00e1ch <em>Classpath<\/em> v\u00e0 nh\u1ea5p v\u00e0o n\u00fat <em>Remove<\/em>.<\/li>\n\n\n\n<li>Nh\u1ea5p v\u00e0o m\u1ee5c <em>User Entries<\/em> trong danh s\u00e1ch <em>Classpath<\/em>, nh\u1ea5p v\u00e0o n\u00fat <em>Add JARs&#8230;<\/em>, ch\u1ecdn m\u1ee5c SweetHome3D-7.5.jar v\u00e0 x\u00e1c nh\u1eadn l\u1ef1a ch\u1ecdn c\u1ee7a b\u1ea1n.<\/li>\n<\/ul>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"618\" height=\"482\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/classpathConfiguration.png\" alt=\"\" class=\"wp-image-5855 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/classpathConfiguration.png 618w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/classpathConfiguration-300x234.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/classpathConfiguration-115x90.png 115w\" data-sizes=\"(max-width: 618px) 100vw, 618px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 618px; --smush-placeholder-aspect-ratio: 618\/482;\" \/><figcaption class=\"wp-element-caption\">H\u00ecnh 10. Thi\u1ebft l\u1eadp classpath c\u1ee7a c\u1ea5u h\u00ecnh g\u1ee1 l\u1ed7i <\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Ch\u1ecdn tab <em>Source<\/em>, nh\u1ea5p v\u00e0o n\u00fat <em>Add\u2026<\/em>, nh\u1ea5p \u0111\u00fap v\u00e0o m\u1ee5c <em>Java Project<\/em> trong h\u1ed9p tho\u1ea1i <em>Add Source<\/em>, ch\u1ecdn m\u1ee5c <em>VolumePlugin<\/em> trong c\u1eeda s\u1ed5 b\u1eadt l\u00ean <em>Project Selection<\/em> v\u00e0 x\u00e1c nh\u1eadn l\u1ef1a ch\u1ecdn c\u1ee7a b\u1ea1n.<\/li>\n<\/ul>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"773\" height=\"549\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/sourcepathConfiguration.png\" alt=\"\" class=\"wp-image-5856 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/sourcepathConfiguration.png 773w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/sourcepathConfiguration-300x213.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/sourcepathConfiguration-127x90.png 127w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/sourcepathConfiguration-768x545.png 768w\" data-sizes=\"(max-width: 773px) 100vw, 773px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 773px; --smush-placeholder-aspect-ratio: 773\/549;\" \/><figcaption class=\"wp-element-caption\"><em><em><em>H\u00ecnh 11. Thi\u1ebft l\u1eadp \u0111\u01b0\u1eddng d\u1eabn ngu\u1ed3n c\u1ee7a c\u1ea5u h\u00ecnh g\u1ee1 l\u1ed7i <\/em><\/em><\/em><\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Cu\u1ed1i c\u00f9ng, nh\u1ea5p v\u00e0o n\u00fat <i>Debug<\/i> \u0111\u1ec3 kh\u1edfi ch\u1ea1y Sweet Home 3D \u1edf ch\u1ebf \u0111\u1ed9 g\u1ee1 l\u1ed7i. Khi ch\u01b0\u01a1ng tr\u00ecnh \u0111ang ch\u1ea1y, m\u1edf t\u1ec7p <tt>VolumePlugin.java<\/tt>, \n \u0111\u1eb7t m\u1ed9t \u0111i\u1ec3m d\u1eebng trong ph\u01b0\u01a1ng th\u1ee9c <i>execute<\/i> v\u00e0 ch\u1ecdn <i>Tools &gt; Compute volume<\/i> t\u1eeb menu Sweet Home 3D. Eclipse s\u1ebd d\u1eebng l\u1ea1i \u1edf \u0111i\u1ec3m d\u1eebng \u0111\u00e3 ch\u1ecdn \n \u0111\u1ec3 b\u1ea1n c\u00f3 th\u1ec3 th\u1ef1c hi\u1ec7n ch\u01b0\u01a1ng tr\u00ecnh t\u1eebng b\u01b0\u1edbc v\u00e0 ki\u1ec3m tra gi\u00e1 tr\u1ecb bi\u1ebfn.  <\/li>\n<\/ul>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"601\" height=\"398\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipseDebug.png\" alt=\"\" class=\"wp-image-5857 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipseDebug.png 601w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipseDebug-300x199.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipseDebug-136x90.png 136w\" data-sizes=\"(max-width: 601px) 100vw, 601px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 601px; --smush-placeholder-aspect-ratio: 601\/398;\" \/><figcaption class=\"wp-element-caption\">H\u00ecnh 12. G\u00f3c nh\u00ecn g\u1ee1 l\u1ed7i c\u1ee7a Eclipse <\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-64989fb1 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/09\/warning-1.gif\" alt=\"\" class=\"wp-image-4679 lazyload\" style=\"--smush-placeholder-width: 21px; --smush-placeholder-aspect-ratio: 21\/21;width:21px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/figure>\n\n\n\n<p>M\u1ed7i khi b\u1ea1n s\u1eeda \u0111\u1ed5i m\u00e3 ngu\u1ed3n c\u1ee7a plug-in, \u0111\u1eebng qu\u00ean <a href=\"#creatingPluginJAR\">t\u1ea1o JAR plug-in<\/a> tr\u01b0\u1edbc khi kh\u1edfi ch\u1ea1y c\u1ea5u h\u00ecnh g\u1ee1 l\u1ed7i m\u00e0 b\u1ea1n \u0111\u00e3 t\u1ea1o. \u0110\u1ec3 t\u0103ng t\u1ed1c qu\u00e1 tr\u00ecnh xu\u1ea5t JAR trong eclipse, h\u00e3y chuy\u1ec3n \u0111\u1ebfn b\u01b0\u1edbc th\u1ee9 hai c\u1ee7a tr\u00ecnh h\u01b0\u1edbng d\u1eabn xu\u1ea5t JAR v\u00e0 ch\u1ecdn t\u00f9y ch\u1ecdn <em>L\u01b0u m\u00f4 t\u1ea3 c\u1ee7a JAR n\u00e0y trong kh\u00f4ng gian l\u00e0m vi\u1ec7c<\/em>. \u0110i\u1ec1u n\u00e0y s\u1ebd th\u00eam m\u1ed9t m\u1ee5c m\u1edbi trong d\u1ef1 \u00e1n v\u1edbi m\u1ed9t m\u1ee5c menu ng\u1eef c\u1ea3nh <em>Create JAR<\/em>.  <\/p>\n<\/div>\n\n<h3 class=\"wp-block-heading\" id=\"deployingPlugin\">Tri\u1ec3n khai plug-in<\/h3>\n\n<p>Khi \u0111\u00e3 s\u1eb5n s\u00e0ng, plug-in c\u1ee7a b\u1ea1n c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c tri\u1ec3n khai tr\u00ean m\u00e1y t\u00ednh c\u1ee7a ng\u01b0\u1eddi d\u00f9ng Sweet Home 3D kh\u00e1c b\u1eb1ng c\u00e1ch \u0111\u01a1n gi\u1ea3n sao ch\u00e9p n\u00f3 v\u00e0o th\u01b0 m\u1ee5c <a href=\"#creatingPluginJAR\">plug-ins<\/a> c\u1ee7a h\u1ecd. T\u1eeb phi\u00ean b\u1ea3n 1.6, m\u1ed9t t\u1ec7p plug-in c\u0169ng c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t trong th\u01b0 m\u1ee5c plug-ins c\u1ee7a Sweet Home 3D b\u1eb1ng c\u00e1ch nh\u1ea5p \u0111\u00fap v\u00e0o n\u00f3, n\u1ebfu ph\u1ea7n m\u1edf r\u1ed9ng c\u1ee7a n\u00f3 l\u00e0 SH3P (ch\u1ec9 c\u1ea7n \u0111\u1ed5i ph\u1ea7n m\u1edf r\u1ed9ng t\u1ec7p t\u1eeb .zip th\u00e0nh .sh3p). N\u1ebfu nh\u1ea5p \u0111\u00fap v\u00e0o t\u1ec7p .sh3p kh\u00f4ng kh\u1edfi ch\u1ea1y Sweet Home 3D (ph\u1ea7n l\u1edbn kh\u1ea3 n\u0103ng d\u01b0\u1edbi Linux), b\u1ea1n c\u0169ng c\u00f3 th\u1ec3 c\u00e0i \u0111\u1eb7t m\u1ed9t plug-in v\u1edbi l\u1ec7nh sau trong c\u1eeda s\u1ed5 <em>Terminal<\/em> (n\u01a1i <code>SweetHome3D<\/code> l\u00e0 t\u00ean c\u1ee7a t\u1ec7p th\u1ef1c thi \u0111\u01b0\u1ee3c cung c\u1ea5p v\u1edbi c\u00e1c tr\u00ecnh c\u00e0i \u0111\u1eb7t Sweet Home 3D):<\/p>\n\n<pre class=\"wp-block-preformatted\"><em>\/path\/to\/<\/em>SweetHome3D <em>\/path\/to\/<\/em>plugin.sh3p<\/pre>\n\n<p>\u0110\u1ec3 ng\u1eebng s\u1eed d\u1ee5ng m\u1ed9t plug-in, h\u00e3y x\u00f3a t\u1ec7p c\u1ee7a n\u00f3 kh\u1ecfi th\u01b0 m\u1ee5c plug-ins v\u00e0 kh\u1edfi \u0111\u1ed9ng l\u1ea1i Sweet Home 3D.<\/p>\n\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-64989fb1 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/09\/warning-1.gif\" alt=\"\" class=\"wp-image-4679 lazyload\" style=\"--smush-placeholder-width: 21px; --smush-placeholder-aspect-ratio: 21\/21;width:21px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/figure>\n\n\n\n<p>N\u1ebfu b\u1ea1n mu\u1ed1n plug-in c\u1ee7a m\u00ecnh c\u00f3 th\u1ec3 ch\u1ea1y v\u1edbi t\u1ea5t c\u1ea3 c\u00e1c tr\u00ecnh c\u00e0i \u0111\u1eb7t <a href=\"https:\/\/www.sweethome3d.com\/vi\/download\/\">Sweet Home 3D<\/a> c\u00f3 s\u1eb5n tr\u00ean trang web n\u00e0y, h\u00e3y ch\u00fa \u00fd gi\u1eef cho n\u00f3 t\u01b0\u01a1ng th\u00edch v\u1edbi Java 5, b\u1eb1ng c\u00e1ch ch\u1ecdn <code>1.5<\/code> trong tr\u01b0\u1eddng <em>Compiler compliance level<\/em> c\u00f3 s\u1eb5n trong ph\u1ea7n <em>Java Compiler<\/em> c\u1ee7a h\u1ed9p tho\u1ea1i \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb b\u1edfi m\u1ee5c menu <em>Project &gt; Properties<\/em> c\u1ee7a Eclipse.<br\/>N\u1ebfu b\u1ea1n s\u1eed d\u1ee5ng phi\u00ean b\u1ea3n tr\u00ecnh bi\u00ean d\u1ecbch Java m\u00e0 t\u00ednh t\u01b0\u01a1ng th\u00edch v\u1edbi Java 1.5 kh\u00f4ng c\u00f2n kh\u1ea3 d\u1ee5ng n\u1eefa, h\u00e3y c\u1ed1 g\u1eafng nh\u1eafm m\u1ee5c ti\u00eau \u00edt nh\u1ea5t Java 1.8 v\u1eabn \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng trong c\u00e1c phi\u00ean b\u1ea3n g\u1ea7n \u0111\u00e2y c\u1ee7a Sweet Home 3D v\u00e0 \u0111\u1eb7t <code>javaMinimumVersion<\/code> trong t\u1ec7p <code>ApplicationPlugin.properties<\/code> c\u1ee7a plug-in c\u1ee7a b\u1ea1n t\u01b0\u01a1ng \u1ee9ng.<\/p>\n<\/div>\n\n<h2 class=\"wp-block-heading\" id=\"goingFurther\">\u0110i xa h\u01a1n<\/h2>\n\n<p>Vi\u1ec7c l\u1eadp tr\u00ecnh plug-in \u0111\u1ea7u ti\u00ean \u0111\u00e3 cho b\u1ea1n th\u1ea5y b\u1ee9c tranh l\u1edbn. D\u01b0\u1edbi \u0111\u00e2y l\u00e0 m\u1ed9t s\u1ed1 th\u00f4ng tin b\u1ed5 sung s\u1ebd gi\u00fap b\u1ea1n \u0111i xa h\u01a1n. <\/p>\n\n<h3 class=\"wp-block-heading\">Sweet Home 3D API &#8211; Javadoc<\/h3>\n\n<p>T\u00e0i li\u1ec7u h\u1eefu \u00edch nh\u1ea5t \u0111\u1ec3 ph\u00e1t tri\u1ec3n m\u1ed9t plug-in m\u1edbi l\u00e0 <a href=\"\/javadoc\/index.html\">Sweet Home 3D API<\/a> (Giao di\u1ec7n L\u1eadp tr\u00ecnh \u1ee8ng d\u1ee5ng), \u0111\u01b0\u1ee3c t\u1ea1o ra v\u1edbi c\u00f4ng c\u1ee5 javadoc.<br\/>Ch\u1ec9 s\u1eed d\u1ee5ng c\u00e1c l\u1edbp c\u1ee7a c\u00e1c g\u00f3i <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/package-summary.html\">com.eteks.sweethome3d.plugin<\/a>, <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/package-summary.html\">com.eteks.sweethome3d.model<\/a>, <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/package-summary.html\">com.eteks.sweethome3d.tools<\/a> v\u00e0 <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/viewcontroller\/package-summary.html\">com.eteks.sweethome3d.viewcontroller<\/a> trong plug-in c\u1ee7a b\u1ea1n n\u1ebfu b\u1ea1n mu\u1ed1n n\u00f3 t\u01b0\u01a1ng th\u00edch v\u1edbi c\u00e1c phi\u00ean b\u1ea3n t\u01b0\u01a1ng lai c\u1ee7a Sweet Home 3D. \u0110i\u1ec1u n\u00e0y s\u1ebd \u0111\u1ee7 l\u1edbn \u0111\u1ec3 l\u1eadp tr\u00ecnh b\u1ea5t k\u1ef3 plug-in n\u00e0o ho\u1ea1t \u0111\u1ed9ng tr\u00ean d\u1eef li\u1ec7u nh\u00e0 c\u00f3 s\u1eb5n trong Sweet Home 3D.<br\/>C\u00e1c g\u00f3i ph\u00f9 h\u1ee3p v\u1edbi c\u00e1c l\u1edbp kh\u00e1c c\u1ee7a ch\u01b0\u01a1ng tr\u00ecnh \u0111\u01b0\u1ee3c bao g\u1ed3m trong Javadoc ch\u1ec9 \u0111\u1ec3 tham kh\u1ea3o th\u00f4ng tin. \u0110\u1eebng d\u1ef1a v\u00e0o API c\u1ee7a ch\u00fang, v\u00ec n\u00f3 c\u00f3 th\u1ec3 v\u1eabn thay \u0111\u1ed5i trong t\u01b0\u01a1ng lai m\u00e0 kh\u00f4ng c\u00f3 \u0111\u1ea3m b\u1ea3o v\u1ec1 t\u00ednh t\u01b0\u01a1ng th\u00edch ng\u01b0\u1ee3c (d\u00f9 sao b\u1ea1n c\u0169ng s\u1ebd kh\u00f4ng th\u1ea5y tham chi\u1ebfu n\u00e0o \u0111\u1ebfn m\u1ed9t l\u1edbp c\u1ee7a c\u00e1c g\u00f3i <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/swing\/package-summary.html\">com.eteks.sweethome3d.swing<\/a>, <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/j3d\/package-summary.html\">com.eteks.sweethome3d.j3d<\/a>, <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/io\/package-summary.html\">com.eteks.sweethome3d.io<\/a> ho\u1eb7c <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/package-summary.html\">com.eteks.sweethome3d<\/a> trong c\u00e1c g\u00f3i \u0111\u00e3 \u0111\u1ec1 c\u1eadp \u1edf tr\u00ean).  <\/p>\n\n<h3 class=\"wp-block-heading\">Ki\u1ebfn tr\u00fac c\u00e1c l\u1edbp Model<\/h3>\n\n<p>Sweet Home 3D d\u1ef1a tr\u00ean ki\u1ebfn tr\u00fac MVC (Model View Controller), v\u00ec v\u1eady hi\u1ec3u c\u00e1ch t\u1ed5 ch\u1ee9c l\u1edbp Model c\u1ee7a n\u00f3 l\u00e0 r\u1ea5t quan tr\u1ecdng. H\u00ecnh 13 (c\u0169ng c\u00f3 s\u1eb5n \u1edf \u0111\u1ecbnh d\u1ea1ng <a href=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/modelClassesDiagram.png\">PDF<\/a>) tr\u00ecnh b\u00e0y g\u1ea7n nh\u01b0 t\u1ea5t c\u1ea3 c\u00e1c l\u1edbp v\u00e0 giao di\u1ec7n c\u00f3 s\u1eb5n trong phi\u00ean b\u1ea3n 1.5 c\u1ee7a g\u00f3i <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/package-summary.html\">com.eteks.sweethome3d.model<\/a> ph\u00f9 h\u1ee3p v\u1edbi l\u1edbp Model n\u00e0y. <\/p>\n\n<p>[uml_diagram slug=&#8221;model-classes-diagram&#8221; map_name=&#8221;model-classes-diagram&#8221; caption=&#8221;Figure 13. UML diagram of com.eteks.sweethome3d.model package&#8221; caption_small=&#8221;(click on a class to view its javadoc)&#8221;]<\/p>\n\n<p>L\u1edbp trung t\u00e2m trong l\u1edbp Model l\u00e0 l\u1edbp <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomeApplication.html\">HomeApplication<\/a> (10), l\u1edbp si\u00eau tr\u1eebu t\u01b0\u1ee3ng c\u1ee7a l\u1edbp ch\u00ednh \u1ee9ng d\u1ee5ng <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/SweetHome3D.html\">SweetHome3D<\/a>. Th\u1ec3 hi\u1ec7n c\u1ee7a l\u1edbp n\u00e0y cung c\u1ea5p quy\u1ec1n truy c\u1eadp v\u00e0o c\u00e1c th\u1ec3 hi\u1ec7n <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">Home<\/a> (7) hi\u1ec7n \u0111ang \u0111\u01b0\u1ee3c ch\u1ec9nh s\u1eeda, v\u00e0 \u0111\u1ed1i t\u01b0\u1ee3ng <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/UserPreferences.html\">UserPreferences<\/a> (11) l\u01b0u tr\u1eef \u0111\u01a1n v\u1ecb \u0111o l\u01b0\u1eddng <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/LengthUnit.html\">chi\u1ec1u d\u00e0i<\/a> \u0111ang s\u1eed d\u1ee5ng (12), <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/FurnitureCatalog.html\">danh m\u1ee5c n\u1ed9i th\u1ea5t<\/a> (14) v\u00e0 <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TexturesCatalog.html\">danh m\u1ee5c k\u1ebft c\u1ea5u<\/a> (15) t\u1eeb \u0111\u00f3 ng\u01b0\u1eddi d\u00f9ng ch\u1ecdn <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogPieceOfFurniture.html\">c\u00e1c m\u00f3n n\u1ed9i th\u1ea5t<\/a> (17) v\u00e0 <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogTexture.html\">k\u1ebft c\u1ea5u<\/a> (18).<br\/>M\u1ed9t th\u1ec3 hi\u1ec7n <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">Home<\/a> (7) l\u01b0u tr\u1eef t\u1ea5t c\u1ea3 c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng m\u00e0 ng\u01b0\u1eddi d\u00f9ng \u0111\u00e3 t\u1ea1o trong k\u1ebf ho\u1ea1ch nh\u00e0: <\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li>danh s\u00e1ch c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomePieceOfFurniture.html\">HomePieceOfFurniture<\/a> (13) th\u1ef1c hi\u1ec7n giao di\u1ec7n <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">PieceOfFurniture<\/a> (16),<\/li>\n\n\n\n<li>b\u1ed9 s\u01b0u t\u1eadp c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.html\">Wall<\/a> (9),<\/li>\n\n\n\n<li>danh s\u00e1ch c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.html\">Room<\/a> (5),<\/li>\n\n\n\n<li>b\u1ed9 s\u01b0u t\u1eadp c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/DimensionLine.html\">DimensionLine<\/a> (2),<\/li>\n\n\n\n<li>b\u1ed9 s\u01b0u t\u1eadp c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Label.html\">Label<\/a> (3).<\/li>\n<\/ul>\n\n<p>C\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng n\u00e0y th\u1ef1c hi\u1ec7n giao di\u1ec7n <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Selectable.html\">Selectable<\/a> (1) c\u0169ng nh\u01b0 \u0111\u1ed1i t\u01b0\u1ee3ng <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/ObserverCamera.html\">ObserverCamera<\/a> (4), l\u01b0u tr\u1eef v\u1ecb tr\u00ed c\u1ee7a m\u00e1y \u1ea3nh trong ch\u1ebf \u0111\u1ed9 <em>Virtual visitor<\/em>. T\u1ea5t c\u1ea3 th\u00f4ng tin b\u00ean ngo\u00e0i \u0111\u01b0\u1ee3c qu\u1ea3n l\u00fd b\u1edfi c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng Model, nh\u01b0 bi\u1ec3u t\u01b0\u1ee3ng v\u00e0 m\u00f4 h\u00ecnh 3D c\u1ee7a m\u1ed9t <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">m\u00f3n n\u1ed9i th\u1ea5t<\/a> (16), ho\u1eb7c h\u00ecnh \u1ea3nh c\u1ee7a m\u1ed9t <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TextureImage.html\">k\u1ebft c\u1ea5u<\/a> (20) \u0111\u01b0\u1ee3c truy c\u1eadp th\u00f4ng qua giao di\u1ec7n <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Content.html\">Content<\/a> (19), \u0111\u01b0\u1ee3c th\u1ef1c hi\u1ec7n b\u1edfi l\u1edbp <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/URLContent.html\">URLContent<\/a> v\u00e0 c\u00e1c l\u1edbp kh\u00e1c c\u1ee7a g\u00f3i <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/package-summary.html\">com.eteks.sweethome3d.tools<\/a>. <\/p>\n\n<p>S\u01a1 \u0111\u1ed3 UML n\u00e0y s\u1ebd gi\u00fap b\u1ea1n hi\u1ec3u c\u00e1c l\u1edbp n\u00e0o c\u00f3 s\u1eb5n trong m\u00f4 h\u00ecnh Sweet Home 3D v\u00e0 c\u00e1ch b\u1ea1n c\u00f3 th\u1ec3 truy c\u1eadp ch\u00fang, nh\u01b0ng b\u1ea1n c\u00f3 th\u1ec3 nh\u1eadn th\u1ea5y r\u1eb1ng kh\u00f4ng c\u00f3 nh\u00e0 t\u1ea1o l\u1eadp v\u00e0 kh\u00f4ng c\u00f3 b\u1ed9 thay \u0111\u1ed5i (ho\u1eb7c b\u1ed9 thi\u1ebft l\u1eadp n\u1ebfu b\u1ea1n th\u00edch) n\u00e0o \u0111\u01b0\u1ee3c \u0111\u1ec1 c\u1eadp trong \u0111\u00f3. \u0110\u00f3 ch\u1ec9 l\u00e0 do thi\u1ebfu kh\u00f4ng gian nh\u01b0ng b\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng ch\u00fang m\u00e0 kh\u00f4ng g\u1eb7p v\u1ea5n \u0111\u1ec1 g\u00ec trong m\u1ed9t l\u1edbp plug-in. C\u0169ng l\u01b0u \u00fd r\u1eb1ng b\u1ea5t k\u1ef3 s\u1eeda \u0111\u1ed5i n\u00e0o c\u1ee7a m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng hi\u1ec7n c\u00f3 c\u1ee7a m\u00f4 h\u00ecnh s\u1ebd \u0111\u01b0\u1ee3c th\u00f4ng b\u00e1o cho c\u00e1c th\u00e0nh ph\u1ea7n hi\u1ec3n th\u1ecb ho\u1eb7c v\u1edbi <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/java\/beans\/PropertyChangeEvent.html\" target=\"_blank\" rel=\"noopener\">PropertyChangeEvent<\/a>s, v\u1edbi <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CollectionEvent.html\">CollectionEvent<\/a>s (8) ho\u1eb7c v\u1edbi <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/SelectionEvent.html\">SelectionEvent<\/a>s (6), do \u0111\u00f3 cho ph\u00e9p t\u1ea5t c\u1ea3 c\u00e1c thay \u0111\u1ed5i \u0111\u01b0\u1ee3c ph\u1ea3n \u00e1nh ngay l\u1eadp t\u1ee9c tr\u00ean m\u00e0n h\u00ecnh.  <\/p>\n\n<div class=\"wp-block-group warning-banner is-nowrap is-layout-flex wp-container-core-group-is-layout-9123dee2 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" width=\"190\" height=\"190\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/11\/Frame-281.png\" alt=\"\" class=\"wp-image-786 lazyload\" style=\"--smush-placeholder-width: 190px; --smush-placeholder-aspect-ratio: 190\/190;width:130px\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/11\/Frame-281.png 190w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/11\/Frame-281-90x90.png 90w\" data-sizes=\"(max-width: 190px) 100vw, 190px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/figure>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer !h-auto wp-container-content-16d1eb73\"><\/div>\n\n\n\n<p>M\u00f4 h\u00ecnh Sweet Home 3D <strong>kh\u00f4ng<\/strong> an to\u00e0n cho lu\u1ed3ng v\u00ec l\u00fd do hi\u1ec7u su\u1ea5t. T\u1ea5t c\u1ea3 <strong>c\u00e1c s\u1eeda \u0111\u1ed5i<\/strong> c\u1ee7a m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng thu\u1ed9c m\u00f4 h\u00ecnh n\u00ean \u0111\u01b0\u1ee3c th\u1ef1c hi\u1ec7n trong Event Dispatch Thread. <\/p>\n<\/div>\n\n<h3 class=\"wp-block-heading\">Ki\u1ebfn tr\u00fac c\u00e1c l\u1edbp plug-in<\/h3>\n\n<p>Ki\u1ebfn tr\u00fac c\u1ee7a c\u00e1c l\u1edbp plug-in d\u1ec5 hi\u1ec3u h\u01a1n nhi\u1ec1u so v\u1edbi l\u1edbp Model. G\u00f3i <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/package-summary.html\">com.eteks.sweethome3d.plugin<\/a> ch\u1ec9 ch\u1ee9a ba l\u1edbp trong \u0111\u00f3 b\u1ea1n \u0111\u01b0\u1ee3c cho l\u00e0 ch\u1ec9 s\u1eed d\u1ee5ng c\u00e1c l\u1edbp <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> v\u00e0 <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, nh\u01b0 \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb trong h\u00ecnh 14 (c\u0169ng c\u00f3 s\u1eb5n \u1edf \u0111\u1ecbnh d\u1ea1ng <a href=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginClassesDiagram.png\">PDF<\/a>). <\/p>\n\n<p>[uml_diagram slug=&#8221;plugin-classes-diagram&#8221; map_name=&#8221;plugin-classes-diagram&#8221; caption=&#8221;Figure 14. UML diagram of com.eteks.sweethome3d.plugin package&#8221; caption_small=&#8221;(click on a class to view its javadoc)&#8221;]<\/p>\n\n<p>M\u1ed9t th\u1ec3 hi\u1ec7n <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginManager.html\">PluginManager<\/a> (1) \u0111\u01b0\u1ee3c t\u1ea1o ra khi kh\u1edfi \u0111\u1ed9ng \u1ee9ng d\u1ee5ng v\u00e0 t\u00ecm ki\u1ebfm c\u00e1c plug-in \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t trong th\u01b0 m\u1ee5c <a href=\"#creating-the-plugin-jar\">plug-ins<\/a> c\u1ee7a ng\u01b0\u1eddi d\u00f9ng. M\u1ed7i khi m\u1ed9t ng\u00f4i nh\u00e0 m\u1edbi \u0111\u01b0\u1ee3c ch\u1ec9nh s\u1eeda, tr\u00ecnh qu\u1ea3n l\u00fd n\u00e0y s\u1ebd kh\u1edfi t\u1ea1o v\u00e0 c\u1ea5u h\u00ecnh m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> (3) cho m\u1ed7i plug-in \u0111\u01b0\u1ee3c t\u00ecm th\u1ea5y khi kh\u1edfi \u0111\u1ed9ng. Sau \u0111\u00f3, n\u00f3 g\u1ecdi ph\u01b0\u01a1ng th\u1ee9c <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html#getActions()\">getActions<\/a> \u0111\u1ec3 truy xu\u1ea5t t\u1ea5t c\u1ea3 c\u00e1c <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">h\u00e0nh \u0111\u1ed9ng<\/a> (4) s\u1ebd \u0111\u01b0\u1ee3c th\u00eam l\u00e0m m\u1ee5c menu v\u00e0\/ho\u1eb7c n\u00fat thanh c\u00f4ng c\u1ee5 trong c\u1eeda s\u1ed5 nh\u00e0. M\u1ed7i h\u00e0nh \u0111\u1ed9ng l\u00e0 m\u1ed9t th\u1ec3 hi\u1ec7n c\u1ee7a <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, tr\u00f4ng gi\u1ed1ng nh\u01b0 l\u1edbp <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/Action.html\" target=\"_blank\" rel=\"noopener\">Action<\/a>, v\u1edbi ph\u01b0\u01a1ng th\u1ee9c <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html#execute()\">execute<\/a> v\u00e0 c\u00e1c <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.Property.html\">thu\u1ed9c t\u00ednh<\/a> (2) c\u00f3 th\u1ec3 thay \u0111\u1ed5i c\u1ee7a n\u00f3.   <\/p>\n\n<p>L\u01b0u \u00fd r\u1eb1ng l\u1edbp <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> cung c\u1ea5p cho b\u1ea1n quy\u1ec1n truy c\u1eadp v\u00e0o m\u1ed9t th\u1ec3 hi\u1ec7n <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/undo\/UndoableEditSupport.html\" target=\"_blank\" rel=\"noopener\">UndoableEditSupport<\/a> th\u00f4ng qua ph\u01b0\u01a1ng th\u1ee9c <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html#getUndoableEditSupport()\">getUndoableEditSupport<\/a> c\u1ee7a n\u00f3. Ngay khi b\u1ea1n s\u1eeda \u0111\u1ed5i m\u1ed9t ng\u00f4i nh\u00e0 ho\u1eb7c c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng c\u1ee7a n\u00f3 (n\u1ed9i th\u1ea5t, t\u01b0\u1eddng&#8230;) trong ph\u01b0\u01a1ng th\u1ee9c th\u1ef1c thi c\u1ee7a m\u1ed9t th\u1ec3 hi\u1ec7n <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, b\u1ea1n c\u0169ng n\u00ean \u0111\u0103ng m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/undo\/UndoableEdit.html\" target=\"_blank\" rel=\"noopener\">UndoableEdit<\/a> v\u00e0o h\u1ed7 tr\u1ee3 ch\u1ec9nh s\u1eeda c\u00f3 th\u1ec3 ho\u00e0n t\u00e1c \u0111\u01b0\u1ee3c tr\u1ea3 v\u1ec1 b\u1edfi ph\u01b0\u01a1ng th\u1ee9c getUndoableEditSupport, n\u1ebfu kh\u00f4ng ng\u01b0\u1eddi d\u00f9ng s\u1ebd kh\u00f4ng th\u1ec3 ho\u00e0n t\u00e1c\/l\u00e0m l\u1ea1i ch\u00ednh x\u00e1c c\u00e1c thay \u0111\u1ed5i b\u1ea1n \u0111\u00e3 th\u1ef1c hi\u1ec7n. <\/p>\n\n<h3 class=\"wp-block-heading\">B\u1ea3n \u0111\u1ecba h\u00f3a<\/h3>\n\n<p>N\u1ebfu b\u1ea1n d\u1ef1 \u0111\u1ecbnh ph\u00e1t tri\u1ec3n m\u1ed9t plug-in cho c\u1ed9ng \u0111\u1ed3ng ng\u01b0\u1eddi d\u00f9ng Sweet Home 3D, h\u00e3y c\u1ed1 g\u1eafng b\u1ea3n \u0111\u1ecba h\u00f3a c\u00e1c chu\u1ed7i m\u00e0 n\u00f3 hi\u1ec3n th\u1ecb trong t\u00ean h\u00e0nh \u0111\u1ed9ng v\u00e0 menu ho\u1eb7c trong c\u00e1c h\u1ed9p tho\u1ea1i b\u1ea1n s\u1ebd t\u1ea1o (ho\u1eb7c \u00edt nh\u1ea5t chu\u1ea9n b\u1ecb b\u1ea3n \u0111\u1ecba h\u00f3a c\u1ee7a n\u00f3). Hai <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html#PluginAction(java.lang.String,%20java.lang.String,%20java.lang.ClassLoader)\">nh\u00e0 t\u1ea1o l\u1eadp c\u1ee7a l\u1edbp PluginAction<\/a> s\u1ebd gi\u00fap b\u1ea1n t\u1ed5 ch\u1ee9c vi\u1ec7c d\u1ecbch c\u00e1c thu\u1ed9c t\u00ednh h\u00e0nh \u0111\u1ed9ng v\u1edbi c\u00e1c t\u1ec7p .properties, v\u00e0 n\u1ebfu b\u1ea1n c\u1ea7n d\u1ecbch c\u00e1c chu\u1ed7i kh\u00e1c trong plug-in c\u1ee7a m\u00ecnh (nh\u01b0 chu\u1ed7i trong h\u1ed9p tho\u1ea1i \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb b\u1edfi <a href=\"#testing-the-plugin\">plug-in \u0111\u00e3 \u0111\u01b0\u1ee3c ki\u1ec3m tra<\/a>) h\u00e3y t\u00e1i s\u1eed d\u1ee5ng c\u00e1c t\u1ec7p .properties n\u00e0y v\u1edbi l\u1edbp Java <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/java\/util\/ResourceBundle.html\" target=\"_blank\" rel=\"noopener\">ResourceBundle<\/a>.<br\/>N\u1ebfu b\u1ea1n mu\u1ed1n gi\u1edbi h\u1ea1n s\u1ed1 l\u01b0\u1ee3ng t\u1ec7p thu\u1ed9c t\u00ednh, b\u1ea1n th\u1eadm ch\u00ed c\u00f3 th\u1ec3 vi\u1ebft c\u00e1c gi\u00e1 tr\u1ecb c\u1ee7a c\u00e1c thu\u1ed9c t\u00ednh h\u00e0nh \u0111\u1ed9ng v\u00e0 c\u00e1c chu\u1ed7i kh\u00e1c trong t\u1ec7p m\u00f4 t\u1ea3 <a href=\"#creating-the-plugin-description-file\">ApplicationPlugin.properties<\/a> c\u1ee7a plug-in c\u1ee7a b\u1ea1n. <\/p>\n\n<p>N\u1ebfu b\u1ea1n mu\u1ed1n m\u1ed9t v\u00ed d\u1ee5 s\u1eed d\u1ee5ng ki\u1ebfn tr\u00fac n\u00e0y, h\u00e3y t\u1ea3i xu\u1ed1ng plug-in <em>Export to SH3F<\/em> c\u00f3 s\u1eb5n t\u1ea1i <a href=\"\/storage\/plugins\/ExportToSH3F-1.0.sh3p\">https:\/\/www.sweethome3d.com\/plugins\/ExportToSH3F-1.0.sh3p<\/a>, v\u00e0 gi\u1ea3i n\u00e9n n\u00f3 (t\u1ec7p plug-in n\u00e0y c\u0169ng ch\u1ee9a m\u00e3 ngu\u1ed3n c\u1ee7a plug-in).<br\/>Nh\u01b0 \u0111\u01b0\u1ee3c m\u00f4 t\u1ea3 trong <a href=\"https:\/\/sourceforge.net\/forum\/message.php?msg_id=5837358\" target=\"_blank\" rel=\"noopener\">Di\u1ec5n \u0111\u00e0n tr\u1ee3 gi\u00fap<\/a>, plug-in n\u00e0y t\u1ea1o ra m\u1ed9t t\u1ec7p SH3F ch\u1ee9a t\u1ea5t c\u1ea3 c\u00e1c n\u1ed9i th\u1ea5t b\u1ea1n \u0111\u00e3 nh\u1eadp v\u00e0o danh m\u1ee5c n\u1ed9i th\u1ea5t c\u1ee7a Sweet Home 3D.<\/p>\n\n<h3 class=\"wp-block-heading\">\u0110\u00f3ng g\u00f3p plug-in<\/h3>\n\n<p>B\u1ea1n c\u00f3 th\u1ec3 \u0111\u0103ng c\u00e1c plug-in m\u00e0 b\u1ea1n \u0111\u00e3 l\u1eadp tr\u00ecnh trong <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/\" target=\"_blank\" rel=\"noopener\">H\u1ec7 th\u1ed1ng Theo d\u00f5i \u0110\u00f3ng g\u00f3p Plug-in<\/a> \u0111\u1ec3 chia s\u1ebb ch\u00fang v\u1edbi c\u1ed9ng \u0111\u1ed3ng ng\u01b0\u1eddi d\u00f9ng Sweet Home 3D.<br\/>Nhi\u1ec1u t\u00ednh n\u0103ng c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c th\u00eam v\u00e0o Sweet Home 3D nh\u1edd c\u00e1c plug-in, t\u1eeb c\u00e1c tr\u00ecnh nh\u1eadp kh\u1ea9u \u0111\u1ebfn c\u00e1c tr\u00ecnh xu\u1ea5t kh\u1ea9u, nh\u01b0ng c\u0169ng c\u00f3 c\u00e1c plug-in c\u00f3 th\u1ec3 s\u1eeda \u0111\u1ed5i d\u1eef li\u1ec7u c\u1ee7a m\u1ed9t ng\u00f4i nh\u00e0 nh\u01b0 <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/1\/\" target=\"_blank\" rel=\"noopener\">Home Rotator Plug-in<\/a> \u0111\u01b0\u1ee3c ph\u00e1t tri\u1ec3n b\u1edfi Michel Mbem v\u00e0 c\u00e1c plug-in kh\u00e1c \u0111\u01b0\u1ee3c li\u1ec7t k\u00ea trong <a href=\"\/storage\/pluginsUserGuide.pdf\">H\u01b0\u1edbng d\u1eabn cho Plug-in v\u00e0 Ti\u1ec7n \u00edch m\u1edf r\u1ed9ng<\/a> (PDF) \u0111\u01b0\u1ee3c vi\u1ebft b\u1edfi Hans Dirkse v\u00e0 trong trang <a href=\"https:\/\/www.sweethome3d.com\/plugins\/\" data-type=\"page\" data-id=\"437\">Plug-in v\u00e0 c\u00f4ng c\u1ee5<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gi\u1edbi thi\u1ec7u T\u1eeb phi\u00ean b\u1ea3n 1.5, c\u00f3 th\u1ec3 th\u00eam c\u00e1c t\u00ednh n\u0103ng m\u1edbi v\u00e0o Sweet Home 3D v\u1edbi c\u00e1c t\u1ec7p plug-in \u0111\u1eb7t trong th\u01b0 m\u1ee5c plug-ins c\u1ee7a b\u1ea1n. \u0110i\u1ec1u n\u00e0y cho ph\u00e9p c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean Java ph\u00e1t tri\u1ec3n v\u00e0 ph\u00e2n ph\u1ed1i c\u00e1c t\u00ednh n\u0103ng m\u1edbi cho Sweet Home 3D m\u00e0 kh\u00f4ng c\u1ea7n s\u1eeda \u0111\u1ed5i<a href=\"https:\/\/www.sweethome3d.com\/vi\/huong-dan-cho-nha-phat-trien-plug-in\/\">Continue reading <span class=\"sr-only\">&#8220;H\u01b0\u1edbng d\u1eabn cho nh\u00e0 ph\u00e1t tri\u1ec3n plug-in&#8221;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":11778,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-resources.php","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-11786","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/www.sweethome3d.com\/vi\/wp-json\/wp\/v2\/pages\/11786","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sweethome3d.com\/vi\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.sweethome3d.com\/vi\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.sweethome3d.com\/vi\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sweethome3d.com\/vi\/wp-json\/wp\/v2\/comments?post=11786"}],"version-history":[{"count":2,"href":"https:\/\/www.sweethome3d.com\/vi\/wp-json\/wp\/v2\/pages\/11786\/revisions"}],"predecessor-version":[{"id":12450,"href":"https:\/\/www.sweethome3d.com\/vi\/wp-json\/wp\/v2\/pages\/11786\/revisions\/12450"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sweethome3d.com\/vi\/wp-json\/wp\/v2\/media\/11778"}],"wp:attachment":[{"href":"https:\/\/www.sweethome3d.com\/vi\/wp-json\/wp\/v2\/media?parent=11786"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}