AutoCAD Electrical Forum
Welcome to Autodesk’s AutoCAD Electrical Forums. Share your knowledge, ask questions, and explore popular AutoCAD Electrical topics.
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Balloon Placement

12 REPLIES 12
Reply
Message 1 of 13
breierg
1167 Views, 12 Replies

Balloon Placement

What dictates where a balloon is located if a leader is not inserted. I have a multi catalog item so I insert one balloon with a leader, two balloons apear which is perfect. Now I want to add another balloon in line with the other two, it never ends up in line, help

Also where are the grips on a balloon, if the grips were at the quadrant the balloon would be easily moved.

Thanks

12 REPLIES 12
Message 2 of 13
junkinjam
in reply to: breierg

I am having the same difficulty. I can't seem to figure out why some balloons can be placed right next to one another, but if I try to place balloons below others, they are off by an angled distance from the balloon I picked for it to go next to.

Any help? Anyone?

Message 3 of 13
breierg
in reply to: breierg

Any thoughts? anyone???

Message 4 of 13
PatMurnen_Adsk
in reply to: junkinjam

It looks like the balloon is placed based on the angle of some imaginary line between the point you select when selecting the block for the balloon and the point you select for the balloon insertion. And because of this method the insertion point of teh balloon is not in the center. I will log this as it makes it difficult to place additional balloons next to it.

 

Sorry I didn't have a better answer.



Pat Murnen
Principal Content Developer
Product Development – AutoCAD Product Line Group

Autodesk, Inc.

Message 5 of 13
breierg
in reply to: breierg

One of my old post from 2010 I'm now running 2017 with the same results has anything changed with this?

 

What dictates where a balloon is located if a leader is not inserted. I have a multi catalog item so I insert one balloon with a leader, two balloons appear which is perfect. Now I want to add another balloon in line with the other two, it never ends up in line, help

 

Also where are the grips on a balloon, if the grips were at the quadrant the balloon would be easily moved.

 

Thanks

Message 6 of 13
TRLitsey
in reply to: breierg

Hi there,

 

ACE 2017 Win 7 64-bit.  Not sure if this will work for you but this is my operation.

 

Click on BALLOON tool.

Select item to be ballooned

Select SNAP QUADRANT tool

Click on the side of the balloon you want to attach tool.

 

Here is where it seems to make the difference, DO NOT click on second point leader, hit the keyboard ENTER.  On my setup the added balloon positions itself on the select side of existing balloon.

 

Good luck

 

Screenshot - 3_7_2017 , 10_00_47 AM.png

Please mark as a solution if this works for you, kudos are always welcome
Message 7 of 13
jseefdrumr
in reply to: TRLitsey

When you insert the balloon, you are prompted 'specify leader start OR BALLOON INSERT POINT'. After you pick that point, the command prompt says '[enter]=balloon only, no leader' ... If you hit enter at this point, there will be no leader and the center of the balloon will come in at the point you just picked.

As for the grips on a balloon, remember that this is a grouped item. You may have ACADE set up to only show one grip point for a group. Go to: Options>Slection tab>Grips>checkbox 'show single grip on groups'.

This issue has frustrated me so much that I completely ignore the ACADE workflow and do it my way.

I don't use the leaders that come with balloons. They aren't true leaders, they're a collection of lines and an arrow that are grouped. So you can't grip-edit them like leaders.

When I place balloons, I use Osnap tracking. I place a balloon, no leader, and then the next one gets tracked from the center of the first one (usually so that it is above the center of the next component). Only rarely do I have subitem balloons, but I do have to go back and adjust those, when it happens.

When I need a leader, I use QLEADER. This is to make it easier to adjust the leader portion of the balloon in case I have to move it later. I also have a block that is a wipeout for my balloons. I make this coincident with the balloon and then draworder the balloon to be above it. This allows me to put balloons over top of non-essential graphics in the drawing. Doing this actually keeps me from having to use leaders at all, in many instances.

Hope this helps a little.

Jim


Jim Seefeldt
Electrical Engineering Technician


Message 8 of 13
Rcooper68MZ8
in reply to: breierg

It's 2020 and the Item Balloons still don't line up correctly even when you use the Quadrant Osnap and hit Enter instead creating a leader.

Why is this such a hard thing to fix?

 

 

 

Message 9 of 13
jseefdrumr
in reply to: Rcooper68MZ8

Autodesk hasn't addressed this, or many other functions of ACADE, in many years. The most that has been done with this software, is to re-release it each year with a new number. I can probably count the number of new features, enhancements, and fixes introduced to ACADE in the last five years on one hand. Definitely on two hands. Really the only one I can actually think of off the top of my head is getting ACADE to use SQL instead of Access for database management.

*No updated catalog - it's been largely unchanged for years. So many obsoleted product lines in there, and none of the new ones.
*Vast majority of commands now are exactly the same as they were in 2015, when I first started using this software. Little to no changes or improvements.
*Virtually none of the 'accepted' ideas from the Idea Station forum have been implemented.

In short, don't expect things to change. It's like having an expensive lease on a 20-year-old car, lol.


Jim Seefeldt
Electrical Engineering Technician


Message 10 of 13
jtoverka
in reply to: jseefdrumr

AutoCAD Electrical is in "Maintenance" mode indefinitely. Meaning that no new features will be added. It's too bad that many American companies prefer AutoCAD Electrical. Otherwise, I would use another software instead.

Message 11 of 13
Thomas.CoxTFXY8
in reply to: jtoverka

They need Nate Holt back...

Message 12 of 13
darrell.l.gregg
in reply to: breierg

Fiddly bit these balloons and Osnap.

 

I just wrote a stack bubbles command (see code source below):

;;; stack_bubbles.lsp
;|
Version history:
v1.0: 02/05/2018.dlg, initial function
v1.1: 05/30/2018.dlg, added ability to detect grip selected objects from bubble_show.lsp and use them for selecting what to stack
v1.2: 06/04/2018.dlg, fixed an error in the ssgetfirst statements, needed to check for a (nil nil) griplist before we check that there is anything grippped.

Usage: (stack_bubbles)

Description:
function will ask user for a selection of bubbles they want stacked, then it will prompt for the direction of the stack. it will then move all the bubbles next to the first bubble
in the order picked, in the direction desired.


Returns:
nil

|;
;;;---------------------------------<<<<<<<< SUB-ROUTINES >>>>>>>>>>>>>>>>>>--------------------------------------------------------------------

;;;
;;; get_block_parts, returns list of enames of the components of a block name passed to it
;;;
(defun get_block_parts ( blknam / ent lst)
(if (setq ent (tblobjname "block" blknam)); get the BLOCK entity from the block table
(while (setq ent (entnext ent));while entnext does not return a nil value, step through the entities in the block definition
(setq lst (cons ent lst));make a list of the block components
); end WHILE

);end if block name
(setq lst (reverse lst));put in order they appear
);end get_block_parts

;;;
;;; get_bitem_inspt, returns the insertion point of the b_item attribute on the ename of the panel label block passed to it
;;;
(defun get_bitem_inspt ( ename / return CUR_ENT_DATA INS_PT LOOPEND LOOP_END NEXT_ENAME NEXT_ENAME_DATA)
(setq cur_ent_data (entget ename));get entity data
(setq next_ename_data cur_ent_data);set next_ename_value to be current entity
(setq loop_end 0)
(while
(not (= loopend 1));loopend does not equal 1
(cond;begin conditional testing
(;condition 1 = B_ITEM found
(and
(equal "ATTRIB" (cdr (assoc 0 next_ename_data)));if the next_ename is the p_num attribute
(equal "B_ITEM" (cdr (assoc 2 next_ename_data)))
);end and
;then change get the insetion point
(setq ins_pt (cdr (assoc 11 next_ename_data)));set value
(setq loopend 1);end loop
);end condtion 1 b_item found
(;condition 2 = seqend found
(equal "SEQEND" (cdr (assoc 0 next_ename_data)));is this the seqend entity?
(setq loopend 1);set the loopend var
);end condition 2
(;condition 3 = not the B_item
(not
(and
(equal "ATTRIB" (cdr (assoc 0 next_ename_data)));if the next_ename is the p_num attribute
(equal "B_ITEM" (cdr (assoc 2 next_ename_data)))
);end and
);end not
(setq next_ename (entnext (cdr (assoc -1 next_ename_data))));get the next ename after current ename
(setq next_ename_data (entget next_ename));get next ename data
(setq loopend 0);don't end the loop, keep looking
);end condition 3 not b_item
);end conditional testing for b_item
);end while
(if ins_pt (setq return ins_pt)(setq return nil))
return
);end defun get_bitem_inspt

 

;;;----------------------------------------------// MAIN \\----------------------------------------------
;;;----------------------------------------------\\ FUNCTION //----------------------------------------------
;;;

(defun stack_bubbles ( /
;|varlist|;
1ST_ENT_DATA
BAD_RADS_LIST
BLOCK_PARTS
CUR_BUB_RAD
CUR_ENT
CUR_ENT_DATA
CUR_ENT_NEW_PT
CUR_NEW_INSPT
CUR_OLD_INSPT
CUR_USER_SEL_DATA
ENT_LIST
ENT_LIST_NAMES
GRIPPED_ENTS
GRIP_SELSET
INDEX
LST_LEN
MASTER_BUB_RAD
MASTER_INS_PT
MOVE_INDEX
MOVE_LIST
STACK_DIR
TEMP_ENT_LIST_NAMES
USER_INPUT
USER_LOOP
USER_SELECTION
)
(vl-load-com)
(vl-cmdf "regen");regenerate the screen in case there are any highlighted objects from bubble_show.lsp
;;;
;;; get list of enames to work on
(setq ent_list '());init list
;;;
;;; going to try and utilize the gripset from the show bubbles command
(if (equal (list nil nil) (ssgetfirst));grip list nil?
(setq user_input nil);then...
(progn;else
(if (and (> (sslength (nth 1 (ssgetfirst))) 1)(setq gripped_ents (nth 1 (ssgetfirst))));are there any preselected items?
(progn;then
(initget "Yes No")
(setq user_input (getkword "\nFound gripped objects, use them for stacking: <Y>/N?"))
(if (or (null user_input) (wcmatch user_input "Yes"));if user presses <enter> or responds "yes"
(setq user_input t);then
(progn;else
(setq user_input nil);else
(sssetfirst nil nil);ungrip select the items
);end progn else
);end if
);end progn then
(if (= (sslength (nth 1 (ssgetfirst))) 1);if there is only one gripped thing
(progn;then
(setq user_input nil);blank this out for later
(sssetfirst nil nil);then clear the grips
);end progn then
);end if, no else
);end if gripped_ents
);end progn else
);end if no grips
(if user_input
(progn;then
(setq index (1- (sslength gripped_ents)));init the index it is always one less than the length of the list because list starts at ZERO
(repeat (sslength gripped_ents);for the length of the list
(setq ent_list (append (list (ssname gripped_ents index)) ent_list));add entity name to list
(setq index (1- index));decrement the index
);end repeat
);end progn then
(progn;else
;;; trying to limit user to selecting just one entity at a time, we can't have window selection
;;; (setq user_selection (setq ent_list (ssget ":S" '((0 . "INSERT")(8 . "PBAL")(2 . "PNL*")))));get the objects that the user wants stacked, the first one is the one all will be stacked to
;;;begin new code for user selection
(setq user_loop t);init var
(while user_loop
(setq user_selection (car (entsel "Pick a bubble: \n")));let the user pick one entity
(if (not (null user_selection));if the pick is not empty
(progn;then...
(setq cur_user_sel_data (entget user_selection));get the entity data for the current entity the user picked
(cond;begin conditional testing of the entity
(;condition 1 = it's an allowed type
(and
(equal '(0 . "INSERT") (assoc 0 cur_user_sel_data));is it an insert?
(equal '(8 . "PBAL") (assoc 8 cur_user_sel_data));is it on the PBAL layer?
(wcmatch (cdr (assoc 2 cur_user_sel_data)) "PNL*" );does the name hvae PNL as the first characters?
);end and
(setq ent_list (append (list user_selection) ent_list));add the entity name to the list
(foreach item ent_list
(redraw item 3);highlight each item selected
);end foreach
(setq user_loop t);setvar, continue loop
);end condition 1 is a bubble
(;condition 2 = it's NOT an allowed type
(not
(and
(equal '(0 . "INSERT") (assoc 0 cur_user_sel_data));is it an insert?
(equal '(8 . "PBAL") (assoc 8 cur_user_sel_data));is it on the PBAL layer?
(wcmatch (cdr (assoc 2 cur_user_sel_data)) "PNL*" );does the name hvae PNL as the first characters?
);end and
);end not
(princ "Object is not a bubble, ignoring\n");send message to screen
(setq user_loop t);setvar, continue loop
);end condition 2 not a bubble
);end conditional testing of user selection
);end progn then
(setq user_loop nil);else end user loop
);end if
);end while
(if (null ent_list);if user didn't pick anything, bail
(progn;then...
(prompt "Nothing selected, aborting\n");message for user
(exit);abort
);end progn then
);end if, no else
;;; check that list is at least 2 elements long
(if (< (length ent_list) 2)
(progn;then
(alert (strcat
"You must select at least 2 bubbles!"
"\n\nCommand will now abort"
)
);end alert
(foreach item ent_list
(redraw item 4);unhighlight entities
);end foreach
(exit);abort
);end then
);end if, no else
);end progn else
);end if

;;;
(setq ent_list_names (reverse ent_list));reverse the user selection list

;;; get stack direction
(initget "Right Left Up Down");init keywords
(setq stack_dir (getkword "Stack direction? <Right>, Left, Up Down?"));get user input
(if (null stack_dir)
(setq stack_dir "Right")
);end if stack_dir null
;;; (setq ent_list_names (ssnamex ent_list));convert selection set to list of enames (and other data we don't need, just seemed like a quick way to get the enames without using a while)
;;; (foreach item ent_list_names
;;; (setq ent_list_enames (append (list (nth 1 item)) ent_list_enames));convert to list of just enames
;;; );end foreach
;;; (setq ent_list_names (reverse ent_list_enames));reverse the list to original pick order
(setq 1st_ent_data (entget (nth 0 ent_list_names)));get the first item in the list of enames, this is the one to stack all others to
(setq block_parts (get_block_parts (cdr (assoc 2 1st_ent_data))));get the parts of the block
(foreach item block_parts
(setq cur_ent_data (entget item))
(if (equal "CIRCLE" (cdr (assoc 0 cur_ent_data)));is this the circle part of the bubble block?
(setq master_bub_rad (cdr (assoc 40 cur_ent_data)));set the bub_rad variable
);end if
);end foreach

;;;
;;; need to check that all bubbles selected have the same bubble radius, if not will bail, will also show them gripped just like SFIN.
;;;
(setq temp_ent_list_names (vl-remove (cdr (assoc -1 1st_ent_data)) ent_list_names))
(foreach item temp_ent_list_names
(setq cur_ent_data (entget item));get the current entities data
(setq block_parts (get_block_parts (cdr (assoc 2 cur_ent_data))));get the block parts
(foreach item block_parts
(setq cur_ent_data (entget item))
(if (equal "CIRCLE" (cdr (assoc 0 cur_ent_data)));is this the circle part of the bubble block?
(setq cur_bub_rad (cdr (assoc 40 cur_ent_data)));set the bub_rad variable
);end if
);end foreach block_parts
(if (/= master_bub_rad cur_bub_rad);do the radii NOT match?
(setq bad_rads_list (append (list item) bad_rads_list));then add the current entity name to the list
);end if, no else
);end foreach
(if bad_rads_list
(progn;then
(setq grip_selset (ssadd));init selection set
(foreach item bad_rads_list
(setq grip_selset (ssadd (car item) grip_selset));add each entity to the selection set
);end foreach
(sssetfirst nil grip_selset);turn on the grips for all changed entities
(alert (strcat
"\nThe selected entities' bubbles do NOT match the first bubble's radius"
"\nYou should redo any bubbles that are the wrong size"
"\n\nCommand will now abort"
)
);end alert
(exit);abort
);end then
);end if no else

;;;
;;; need to get the insertion point of the master bubble, this will be the center of the bubble which is determined by the insertion point of the B_ITEM attribute
(if master_bub_rad;if we have a bubble radius from the first block
(progn;then
;;; (setq cur_ent (nth 0 ent_list_names));get the first item in the list of enames, this is the one to stack all others to
(setq master_ins_pt (get_bitem_inspt (cdr (assoc -1 1st_ent_data))));call get_bitem_inspt and get value for current insertion point of current block
);end progn then
(progn;else, we didn't find the bubble radius we must bail
(alert (strcat
"Could not find the radius of the 1st bubble selected!"
"\nFirst bubble name : " (cdr (assoc 2 1st_ent_data))
"\nFirst bubble handle: " (cdr (assoc 5 1st_ent_data))
"\n\nCommand cannot continue, will now abort"
)
);end alert
(exit);abort
);end progn else no radius
);end if bub_rad
;;;
(foreach item ent_list_names
(redraw item 4);unhighlight entities
);end foreach

;;; we have the master insert point, need to gather the rest of the stack points.

(setq ent_list_names (vl-remove (cdr (assoc -1 1st_ent_data)) ent_list_names));remove the 1st entity from the list
(setq lst_len (length ent_list_names))
(setq move_list '());init list
(cond;conditional testing of stack direction
(;condition 1 = Right
(equal "Right" stack_dir);right stacking
(setq index 0);set index #
(repeat lst_len
(setq cur_ent_data (entget (nth index ent_list_names)));get current entities data
(setq cur_old_inspt (get_bitem_inspt (cdr (assoc -1 cur_ent_data))));set to insert point of it's b_item attribute
(setq cur_new_inspt (subst (+ (car master_ins_pt) (* (+ index 1) (* 2 master_bub_rad))) (car cur_old_inspt) cur_old_inspt));x value
(setq cur_new_inspt (subst (cadr master_ins_pt) (cadr cur_old_inspt) cur_new_inspt));y value
(setq move_list (append (list cur_new_inspt) move_list));add new point to list
(setq index (1+ index))
);end repeat
(setq move_list (reverse move_list));reverse list
);end condition 1
(;condition 2 = Left
(equal "Left" stack_dir);left stacking
(setq index 0);set index #
(repeat lst_len
(setq cur_ent_data (entget (nth index ent_list_names)));get current entities data
(setq cur_old_inspt (get_bitem_inspt (cdr (assoc -1 cur_ent_data))));set to insert point of it's b_item attribute
(setq cur_new_inspt (subst (- (car master_ins_pt) (* (+ index 1) (* 2 master_bub_rad))) (car cur_old_inspt) cur_old_inspt));x value
(setq cur_new_inspt (subst (cadr master_ins_pt) (cadr cur_old_inspt) cur_new_inspt));y value
(setq move_list (append (list cur_new_inspt) move_list));add new point to list
(setq index (1+ index))
);end repeat
(setq move_list (reverse move_list));reverse list
);end condition 2
(;condition 3 = Up
(equal "Up" stack_dir);up stacking
(setq index 0);set index #
(repeat lst_len
(setq cur_ent_data (entget (nth index ent_list_names)));get current entities data
(setq cur_old_inspt (get_bitem_inspt (cdr (assoc -1 cur_ent_data))));set to insert point of it's b_item attribute
(setq cur_new_inspt (subst (car master_ins_pt) (car cur_old_inspt) cur_old_inspt));x value
(setq cur_new_inspt (subst (+ (cadr master_ins_pt) (* (+ index 1) (* 2 master_bub_rad))) (cadr cur_old_inspt) cur_new_inspt));y value
(setq move_list (append (list cur_new_inspt) move_list));add new point to list
(setq index (1+ index))
);end repeat
(setq move_list (reverse move_list));reverse list
);end condition 3
(;condition 4 = Down
(equal "Down" stack_dir);down stacking
(setq index 0);set index #
(repeat lst_len
(setq cur_ent_data (entget (nth index ent_list_names)));get current entities data
(setq cur_old_inspt (get_bitem_inspt (cdr (assoc -1 cur_ent_data))));set to insert point of it's b_item attribute
(setq cur_new_inspt (subst (car master_ins_pt) (car cur_old_inspt) cur_old_inspt));x value
(setq cur_new_inspt (subst (- (cadr master_ins_pt) (* (+ index 1) (* 2 master_bub_rad))) (cadr cur_old_inspt) cur_new_inspt));y value
(setq move_list (append (list cur_new_inspt) move_list));add new point to list
(setq index (1+ index))
);end repeat
(setq move_list (reverse move_list));reverse list
);end condition 4
);end conditionals for direction
(setq move_index 0)
(while (< move_index (length ent_list_names))
(setq cur_ent (nth move_index ent_list_names));set current entity to move
(setq cur_ent_new_pt (nth move_index move_list));set current entity new point
(cmd-s)
(progn;
(vl-cmdf "move");move
(vl-cmdf cur_ent "");current entity
(vl-cmdf (get_bitem_inspt (cdr (assoc -1 (entget cur_ent)))))
(vl-cmdf cur_ent_new_pt)
);end progn
(cmd-e)
(setq move_index (1+ move_index));increment the index
);end while
(princ);end quitely
);end defun stack_bubbles

 

Message 13 of 13
darrell.l.gregg
in reply to: breierg

see my post in the thread about a stackbubles lisp...

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk Design & Make Report

”Boost